2016-10-15 81 views
6

send aracılığıyla bir jeneratöre iletilen bir değerin dizinine doğrudan erişerek python (2.7.10) kodunu daha basit hale getirebileceğimi düşündüm ve kodun şaşırdığını gördüm. Sonra gerçekten bir şey yapmaz yield uygulanan bir dizin keşfetti, ne de bir özel durum oluşturur:Niçin endekslenebiliyor?

def gen1(): 
    t = yield[0][0][0] 
    assert t 
    yield False 

g = gen1() 
next(g) 
g.send('char_str') 
: Ben endeksi yield üç kez ya da daha fazla çalışırsanız, ancak

def gen1(): 
    t = yield[0] 
    assert t 
    yield False 

g = gen1() 
next(g) 
g.send('char_str') 

, bir istisna olsun

TypeError: 'int' object has no attribute '__getitem__' 

atar

Bu alışılmadık tutarsız davranış olduğunu ve ne indeksleme verimi i için sezgisel açıklaması vardır acaba aslında yapıyor?

cevap

13

İndeks oluşturmuyorsunuz. Bir liste veriyorsunuz; ifadesi yield[0] gerçekten sadece aynıdır (ancak bir değişken olmadan) şunlardır:

>>> def gen1(): 
... t = yield[0] 
... assert t 
... yield False 
... 
>>> g = gen1() 
>>> next(g) 
[0] 

Sen don':

lst = [0] 
yield lst 

Eğer next() sen o listeyi kazanılmış olurdu döndü olanlara bakarsanız , yield ve [0] arasında bir alana sahip olmak için'a sahiptir, hepsi bu kadardır. Eğer dizine jeneratöre gönderilen bir değer istiyorsanız

>>> [0]  # list with one element, the int value 0 
[0] 
>>> [0][0]  # indexing the first element, so 0 
0 
>>> [0][0][0] # trying to index the 0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'int' object is not subscriptable 

, yield ifadesinin parantez koymak:

istisnası içerdiği 0 tam sayıya abonelik uygulamak için çalışıyor kaynaklanır

t = (yield)[0] 

Demo:

>>> def gen1(): 
...  t = (yield)[0] 
...  print 'Received: {!r}'.format(t) 
...  yield False 
... 
>>> g = gen1() 
>>> next(g) 
>>> g.send('foo') 
Received: 'f' 
False