Wie kann man jeweils einen Wert von einer Generatorfunktion in Python abrufen?

113

Sehr grundlegende Frage - wie erhält man einen Wert von einem Generator in Python?

Bisher habe ich festgestellt, dass ich eine durch Schreiben bekommen kann gen.next(). Ich möchte nur sicherstellen, dass dies der richtige Weg ist.

bodacydo
quelle

Antworten:

154

Ja oder next(gen)in 2.6+.

Ignacio Vazquez-Abrams
quelle
3
Ich weiß, dass es peinlich ist, warum das nicht funktioniert. W1 = params.next()aber erhalten Sie einen FehlerAttributeError: 'generator' object has no attribute 'next'
Charlie Parker
2
@CharlieParker Sie müssen Python 3 verwenden!
Akshay Lokur
66

Verwenden Sie in Python <= 2.5 gen.next(). Dies funktioniert für alle Python 2.x-Versionen, jedoch nicht für Python 3.x.

Verwenden Sie in Python> = 2.6 next(gen). Dies ist eine eingebaute Funktion und klarer. Es wird auch in Python 3 funktionieren.

Beide rufen am Ende eine speziell benannte Funktion auf next(), die durch Unterklassen überschrieben werden kann. In Python 3 wurde diese Funktion jedoch umbenannt __next__(), um mit anderen Sonderfunktionen übereinzustimmen.

Christian Oudard
quelle
16

Verwenden Sie (für Python 3)

next(generator)

Hier ist ein Beispiel

def fun(x):
    n = 0
    while n < x:
        yield n
        n += 1
z = fun(10)
next(z)
next(z)

sollte drucken

0
1
dshri
quelle
2

Um den Wert zu erhalten, der einem Generatorobjekt in Python 3 und höher zugeordnet ist, verwenden Sie next(<your generator object>). Nachfolgende Aufrufe von next () erzeugen aufeinanderfolgende Objektwerte in der Warteschlange.

Ryukendo Dey
quelle
1

In Python 3 haben Sie nicht gen.next(), aber Sie können immer noch verwenden next(gen). Ein bisschen bizarr, wenn du mich fragst, aber so ist es.

Niki.py.
quelle
1
Es ist nicht so seltsam. Python 3 soll Dinge kaputt machen und nur den klareren, besseren Code zulassen. Die mangelnde Abwärtskompatibilität ist der Grund für einige wichtige Änderungen.
Tatarize