Gemeinsame Verwendung von Return und Yield in Python-Generatoren
In Python 2 führte eine Return-Anweisung innerhalb einer Generatorfunktion, die auch Yield verwendete, zu ein Fehler. In Python 3.3 kam es jedoch zu einer subtilen Änderung.
Codedemonstration
Bedenken Sie den folgenden Python 3.3-Code:
<code class="python">def f(): return 3 yield 2 x = f() print(x.__next__())</code>
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 Aufruf seiner next-Methode 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:
<code class="python">def f(): yield 3 raise StopIteration</code>
Beispiel mit Yield from
Das folgende Beispiel zeigt, wie sich dieses Verhalten auf Generatoren auswirkt, die mit der yield from-Syntax delegiert wurden:
<code class="python">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</code>
In diesem Fall ist die Ausbeute der 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.
Das obige ist der detaillierte Inhalt vonWie funktionieren Return und Yield in Python 3.3-Generatoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!