„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie funktionieren Return und Yield in Python 3.3-Generatoren?

Wie funktionieren Return und Yield in Python 3.3-Generatoren?

Veröffentlicht am 01.11.2024
Durchsuche:758

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

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.

Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729747611 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

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