In dieser Frage habe ich eine endlose Sequenz mit Python-Generatoren. Der gleiche Code funktioniert jedoch nicht in Python 3, da anscheinend keine next()
Funktion vorhanden ist. Was ist das Äquivalent für die next
Funktion?
def updown(n):
while True:
for i in range(n):
yield i
for i in range(n - 2, 0, -1):
yield i
uptofive = updown(6)
for i in range(20):
print(uptofive.next())
python
python-3.x
Max
quelle
quelle
for i in range(n)
Warum wird im ersten Fall nichtyield
einfach "1" zurückgegeben? Stattdessen wird der Code nach dem ersten Wert im Bereich fortgesetzt und ergibt den gesamten Bereich, was für mich so aussieht, als würde Yield mehrmals gleichzeitig aufgerufen. Ich habe ein wenig Probleme, die Nuance zu verstehen.for
Wenn Sie das aus Ihrer Funktion erstellte Generatorobjekt zum ersten Mal aufrufen, wird der Code in Ihrer Funktion von Anfang an ausgeführt, bis er trifftyield
. Anschließend wird der erste Wert der Schleife zurückgegeben. Dann führt jeder andere Aufruf die Schleife, die Sie in die Funktion geschrieben haben, noch einmal aus und gibt den nächsten Wert zurück, bis kein Wert mehr zurückzugeben ist. (aus diesem Tutorial entnommen )Antworten:
Verwenden Sie in Python 3
next(uptofive)
anstelle vonuptofive.next()
.Die integrierte
next()
Funktion funktioniert auch in Python 2.6 oder höher.quelle
In Python 3 wurde die
next()
Methode umbenannt , um die Syntax konsistenter zu machen__next__()
. Du könntest das benutzen. Dies wird in PEP 3114 erläutert .Es wird empfohlen, Gregs Lösung zu folgen
next()
und die integrierte Funktion aufzurufen (die dann versucht, die__next__()
Methode eines Objekts zu finden ).quelle