In Python 3 gibt es keine next () -Funktion in einem Ertragsgenerator

84

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 nextFunktion?

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())
Max
quelle
Wie funktioniert dieser Code? Ich verstehe, dass es funktioniert, aber nach dem, was ich gelesen habe, "Die Ausführung des Codes stoppt, wenn eine Yield-Anweisung erreicht wurde". ( python-course.eu/python3_generators.php ). for i in range(n)Warum wird im ersten Fall nicht yieldeinfach "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.
Mike S
forWenn Sie das aus Ihrer Funktion erstellte Generatorobjekt zum ersten Mal aufrufen, wird der Code in Ihrer Funktion von Anfang an ausgeführt, bis er trifft yield. 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 )
Mattia Paterna

Antworten:

122

Verwenden Sie in Python 3 next(uptofive)anstelle von uptofive.next().

Die integrierte next()Funktion funktioniert auch in Python 2.6 oder höher.

Greg Hewgill
quelle
35
Whyyyyyyyyyyyyy
Kenny Worden
44

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 folgennext() und die integrierte Funktion aufzurufen (die dann versucht, die __next__()Methode eines Objekts zu finden ).

cfi
quelle
1
Zumal die Funktion zwischen Version 2 und 3 portierbar ist, die Methoden (wegen der Namensänderung) jedoch nicht.
Holdenweb