Ist generator.next () sichtbar in Python 3.0?
-
21-08-2019 - |
Frage
Ich habe einen Generator, der eine Reihe erzeugt, zum Beispiel:
def triangleNums():
'''generate series of triangle numbers'''
tn = 0
counter = 1
while(True):
tn = tn + counter
yield tn
counter = counter + 1
in Python 2.6 kann ich die folgenden Anrufe vor:
g = triangleNums() # get the generator
g.next() # get next val
jedoch in 3.0, wenn ich die gleichen zwei Zeilen Code ausführen ich die folgende Fehlermeldung erhalten:
AttributeError: 'generator' object has no attribute 'next'
, aber die Schleife Iterator Syntax in 3.0 funktioniert
for n in triangleNums():
if not exitCond:
doSomething...
Ich habe nicht in der Lage, etwas zu finden noch, dass dieser Unterschied im Verhalten für 3.0 erklärt.
Lösung
Richtig, g.next()
wurde g.__next__()
umbenannt. Der Grund hierfür ist die Konsistenz: Spezielle Methoden wie __init__()
und __del__
alle doppelten Unterstrichen (oder „dunder“ in der aktuellen Mundart) und .next()
war eine der wenigen Ausnahmen von dieser Regel. Dies wurde in Python 3.0 behoben. [*]
Doch statt g.__next__()
zu nennen, wie Paolo sagt, Verwendung next(g)
.
[*] Es gibt andere spezielle Attribute, die dieses Update bekommen haben; func_name
wird __name__
jetzt, etc.
Andere Tipps
Versuchen:
next(g)
Sehen Sie sich diese ordentlich Tabelle , dass die Unterschiede in der Syntax zwischen 2 und 3, wenn es dazu kommt.
Wenn Ihr Code muss unter Python2 und Python3 ausführen, verwenden Sie die 2to3 sechs Bibliothek wie diese :
import six
six.next(g) # on PY2K: 'g.next()' and onPY3K: 'next(g)'