Heim  >  Artikel  >  Backend-Entwicklung  >  Wie wirkt sich Return auf das Generatorverhalten in Python 3.3 aus?

Wie wirkt sich Return auf das Generatorverhalten in Python 3.3 aus?

Barbara Streisand
Barbara StreisandOriginal
2024-10-24 17:16:02675Durchsuche

How does Return Affect Generator Behavior in Python 3.3?

Return Inside Generator with Yield

In Python 3.3 wurde eine wesentliche Änderung hinsichtlich der Verwendung von Return neben Yield innerhalb von Generatorfunktionen eingeführt. Im Gegensatz zu Python 2, wo ein solcher Code einen Fehler auslösen würde, ist dies in Python 3.3 möglich. Das Verhalten unterscheidet sich jedoch von dem, was man erwarten könnte.

Betrachten Sie den folgenden Python 3.3-Code:

<code class="python">def f():
  return 3
  yield 2
  
x = f()
print(x.__next__())</code>

Wenn Sie diesen Code ausführen, werden Sie feststellen, dass eine Ausnahme ausgelöst wird: StopIteration: 3. Diese Ausnahme hat zwei Hauptaspekte:

  • StopIteration wird ausgelöst: Die Return-Anweisung innerhalb der Generatorfunktion entspricht jetzt dem Auslösen von StopIteration().
  • Wert, auf den über eine Ausnahme zugegriffen werden kann: Auf den zurückgegebenen Wert (in diesem Fall 3) kann über das Wertattribut des Ausnahmeobjekts zugegriffen werden.

Also, wenn ein Generator Wenn die Funktion sowohl return als auch yield enthält, ist das so, als würde man eine StopIteration-Ausnahme mit dem angegebenen Rückgabewert auslösen. Dies bedeutet, dass der Generator beendet wird und der zurückgegebene Wert über das Wertattribut der Ausnahme verfügbar ist.

Mit anderen Worten: Während die Rückgabe in einer Generatorfunktion zuvor ein Fehler war, hat sie jetzt einen bestimmten Zweck: zu Beenden Sie den Generator und geben Sie einen Wert über den Ausnahmebehandlungsmechanismus zurück.

Dieses Verhalten hat Auswirkungen auf die Generatordelegierung unter Verwendung der neuen Yield-from-Syntax in Python 3.3. Zum Beispiel:

<code class="python">def f():
    return 1
    yield 2

def g():
    x = yield from f()
    print(x)

# Iterate over generator to run it
for _ in g():
    pass</code>

In diesem Code gibt der Generator f 1 zurück und delegiert dann an den Generator g, der den zurückgegebenen Wert ausgibt. Sie sehen jedoch nur 1 gedruckt, was darauf hinweist, dass die Yield-Anweisung die Delegation stoppt, bevor die Yield-Anweisung in f den Wert 2 erzeugen kann.

Das obige ist der detaillierte Inhalt vonWie wirkt sich Return auf das Generatorverhalten in Python 3.3 aus?. 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