Heim  >  Artikel  >  Backend-Entwicklung  >  Kann die Rückkehr in Generatoren in Python 3.3 StopIteration-Ausnahmen auslösen?

Kann die Rückkehr in Generatoren in Python 3.3 StopIteration-Ausnahmen auslösen?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-24 16:56:02452Durchsuche

Can Returning Inside Generators in Python 3.3 Substitute Raise StopIteration Exceptions?

Rückkehr innerhalb eines Generators: Eine Python 3.3-Innovation

In früheren Python-Versionen führte die Verwendung von Return und Yield innerhalb derselben Funktionsdefinition dazu in einem Fehler. Mit Python 3.3 wurde jedoch eine wesentliche Änderung eingeführt.

Bedenken Sie den folgenden Code:

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

In diesem Code erscheint die Return-Anweisung vor der Yield-Anweisung. Gemäß dem neuen Verhalten entspricht „die Rückgabe von in einem Generator jetzt dem Auslösen von StopIteration()“. Daher löst die Return-Anweisung im obigen Code im Wesentlichen eine StopIteration-Ausnahme mit dem Wert 3 aus.

Wenn die Funktion next für das Generatorobjekt aufgerufen wird, löst sie eine StopIteration-Ausnahme mit dem Wert aus 3, was der Rückgabe von 3 entspricht. Dieser Wert kann jedoch nicht direkt abgerufen werden, da der Generator beendet wurde. Stattdessen kann auf den Wert als Wertattribut des Ausnahmeobjekts zugegriffen werden.

<code class="python">x = f()
try:
    x.__next__()
except StopIteration as e:
    print(e.value)  # Outputs 3</code>

Wenn der Generator außerdem mit der Syntax yield from verwendet wird, fungiert er als Rückgabewert.

<code class="python">def g():
    x = yield from f()
    print(x)

for _ in g():
    pass</code>

In diesem Fall ist die Ausgabe 1 (der Rückgabewert von f), aber 2 wird nicht gedruckt, da der Generator beendet wurde.

Das obige ist der detaillierte Inhalt vonKann die Rückkehr in Generatoren in Python 3.3 StopIteration-Ausnahmen auslösen?. 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