Heim  >  Artikel  >  Backend-Entwicklung  >  Wie funktionieren Return und Yield in Python 3.3-Generatoren?

Wie funktionieren Return und Yield in Python 3.3-Generatoren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-25 04:39:02326Durchsuche

How Do Return and Yield Work Together in Python 3.3 Generators?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn