Gemeinsame Verwendung von Return und Yield in Python-Generatoren
In Python 2 würde eine Return-Anweisung innerhalb einer Generatorfunktion, die auch Yield verwendet, zu Folgendem führen: ein Fehler. In Python 3.3 kam es jedoch zu einer geringfügigen Änderung.
Codedemonstration
Bedenken Sie den folgenden Python 3.3-Code:
def f():
return 3
yield 2
x = f()
print(x.__next__())
Erläuterung
In diesem Code enthält die Funktion f sowohl eine Return-Anweisung als auch eine Yield-Anweisung. Beim Aufruf der Funktion wird zunächst die Return-Anweisung ausgeführt und der Wert 3 zurückgegeben. Infolgedessen wird die Yield-Anweisung nicht ausgeführt.
Wenn der Generator x durch Aufrufen seiner Methode next iteriert wird, wird eine StopIteration-Ausnahme mit dem Wert 3 ausgelöst. Dies bedeutet, dass die Der Iterator des Generators ist erschöpft und der von der Return-Anweisung zurückgegebene Wert ist als Wertattribut der Ausnahme verfügbar.
Neuer Mechanismus in Python 3.3
Gemäß PEP 380 , dieses Verhalten ist eine neue Funktion, die in Python 3.3 eingeführt wurde. Es entspricht dem Schreiben von:
def f():
yield 3
raise StopIteration
Beispiel mit Yield from
Das folgende Beispiel zeigt, wie sich dieses Verhalten auf Generatoren auswirkt, die mit der yield from-Syntax delegiert wurden:
def f():
return 1
yield 2
def g():
x = yield from f()
print(x)
# g is still a generator so we need to iterate to run it:
for _ in g():
pass
In diesem Fall wird die yield from-Anweisung an den Generator f delegiert. Da f einen Wert zurückgibt, aber keine Yield-Anweisungen mehr enthält, wird der Wert 1 ausgegeben. Die yield 2-Anweisung in f wird jedoch nicht ausgeführt.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3