2016-08-05 22 views
2

Das ist fast sicher ein Ergebnis meiner Unkenntnis, wie Generatoren funktionieren, aber ich bin völlig verloren.Warum wird diese Python-Generator-Funktion nur einmal korrekt ausgeführt?

Wenn ich interaktiv den folgenden Generator erstellen:

def neighborhood(iterable): 
    iterator = iter(iterable) 
    prev = None 
    item = next(iterator) 
    for post in iterator: 
     yield (prev,item,post) 
     prev = item 
     item = post 
    yield (prev,item,None) 

und es dann gerne testen:

for prev,item,next in neighborhood([1,2,3,4,5]): 
print(prev, item, next) 

Es produziert:

None 1 2 
1 2 3 
2 3 4 
3 4 5 
4 5 None 

wie erwartet. Wenn ich es wieder laufen, oder versuchen Sie es in irgendeiner Weise neu zu definieren, erhalte ich eine

'NoneType' Objekt ist nicht aufrufbar“

Fehler.

Antwort

7

Wenn Sie tat

for prev,item,next in ... 
#    ^^^^ 

Sie shadowed die eingebaute next Funktion.Wenn Sie das nächste Mal versuchen, Ihren Generator zu verwenden, schlägt es fehl, weil es Ihre next Variabel bekommt le anstelle der Funktion, die es benötigt.

+0

Dang es. Ja. So dumm. – WildGunman

3

Es ist weil Sie eine Variable mit dem Namen next in Ihrem Testcode verwenden. Verwenden Sie einen Namen, der die integrierte Funktion next nicht überschattet.