Pythons yield meistern: Generator vs. Return – Ein praktischer Leitfaden
Pythons yield meistern: Generator vs. Return – Ein praktischer Leitfaden
Was ist Python yield?
Das Schlüsselwort yield verhält sich wie return, gibt aber statt eines Werts sofort ein Generator-Objekt zurück, über das iteriert werden kann. Wenn eine Funktion, die yield enthält, aufgerufen wird, pausiert die Ausführung bei der ersten yield-Anweisung und gibt die Kontrolle mit einem Generator an den Aufrufer zurück. Nachfolgende Aufrufe von next() oder eine for-Schleife setzen die Ausführung an dieser Stelle fort und liefern den nächsten Wert.
Wichtigste Erkenntnisse
- Yield erzeugt einen Generator, der lazy Evaluation ermöglicht.
- Generatoren sind speichereffizient für große oder unendliche Sequenzen.
- Das Lesen aus einem Generator kann mit
for-in,list()odernext()erfolgen. - Einmal erschöpft, kann ein Generator nicht wiederverwendet werden; rufen Sie die Funktion erneut auf.
Syntax
yield ausdruck
Praktisches Beispiel: Einfaches Yield
def test_yield():
yield "Willkommen bei Guru99 Python Tutorials"
output = test_yield()
print(output)
Ausgabe:
<generator object test_yield at 0x00000028265EB9A8>
Das Generator-Objekt hält den yielded Wert. Um darauf zuzugreifen, iterieren Sie:
for value in output:
print(value)
Ausgabe:
Willkommen bei Guru99 Python Tutorials
Generatoren erklärt
Eine Generator-Funktion ist eine spezielle Funktion, die ein iterierbares Generator-Objekt zurückgibt. Im Gegensatz zu regulären Funktionen, die einen einzelnen Wert zurückgeben, liefert ein Generator eine Sequenz von Werten lazy – er produziert jeden Wert erst dann, wenn er angefordert wird.
Generator-Funktion erstellen
def generator_beispiel():
yield "H"
yield "E"
yield "L"
yield "L"
yield "O"
for buchstabe in generator_beispiel():
print(buchstabe)
Ausgabe:
H E L L O
Normale Funktion vs. Generator-Funktion
Betrachten Sie das folgende Funktionspaar:
# Normale Funktion
def normale_test():
return "Hello World"
# Generator-Funktion
def generator_test():
yield "Hello World"
print(normale_test()) # → Hello World
print(generator_test()) # → <generator object generator_test>
Normale Funktionen enden bei return; Generatoren pausieren bei yield und geben die Kontrolle mit einem Generator-Objekt an den Aufrufer zurück.
Generator konsumieren
Sie können Werte aus einem Generator ziehen mit:
for-in-Schleifenlist()um alle Werte zu materialisierennext()für manuelles Schritt-für-Schritt
Beispiel: Gerade Zahlen
def gerade_zahlen(n):
for x in range(n):
if x % 2 == 0:
yield x
print(list(gerade_zahlen(10))) # → [0, 2, 4, 6, 8]
for-in verwenden
for num in gerade_zahlen(10):
print(num)
Ausgabe:
0 2 4 6 8
next() verwenden
gen = gerade_zahlen(10)
for _ in range(6):
try:
print(next(gen))
except StopIteration:
print("Ende des Generators")
Ausgabe:
0 2 4 6 8 Ende des Generators
Generatoren sind einmalig nutzbar
Einmal vollständig iteriert, ist ein Generator erschöpft. Erneutiges Iterieren liefert nichts, es sei denn, die Generator-Funktion wird erneut aufgerufen.
gen = gerade_zahlen(10)
for num in gen:
print(num)
print(list(gen)) # → []
Yield in Aktion: Fibonacci-Reihe
def fibonacci_reihe(limit):
a, b = 0, 1
count = 0
while count < limit:
yield a
a, b = b, a + b
count += 1
fib = fibonacci_reihe(7)
for num in fib:
print(num)
Ausgabe:
0 1 1 2 3 5 8
Funktion aufrufen, die yielded
Im Folgenden quadrieren wir Zahlen mit einer Hilfsfunktion und einem Generator, der jedes Ergebnis yielded.
def quadrat(n):
return n * n
def quadrat_bereich(n):
for i in range(n):
yield quadrat(i)
for value in quadrat_bereich(10):
print(value)
Ausgabe:
0 1 4 9 16 25 36 49 64 81
Wann yield statt return verwenden
- Verarbeitung großer oder Streaming-Daten, wo das Laden aller Elemente auf einmal unpraktisch ist.
- Erzeugung potenziell unendlicher Sequenzen (z. B. lazy Datei-Reader).
- Verbesserung des Speicherbedarfs und der Startzeit für große Datensätze.
- Wenn Sie Berechnung pausieren und fortsetzen müssen, nicht nur einen Endwert zurückgeben.
Yield vs. Return – Kurze Referenz
| Yield | Return |
|---|---|
| Gibt einen Generator zurück; Ausführung wird bei Iteration fortgesetzt. | Beendet Funktion; gibt einzelnen Wert sofort zurück. |
Pausiert bei jedem yield, spart Speicher. | Allokiert Speicher für den Rückgabewert. |
| Ideal für große oder unendliche Sequenzen. | Geeignet für kleine, diskrete Ergebnisse. |
| Ausführungszeit schneller für große Datensätze. | Kann Overhead bei riesigen Daten verursachen. |
Wichtigste Erkenntnisse
- Yield erzeugt ein Generator-Objekt, keinen Wert.
- Generatoren liefern Werte lazy, halten Speicherverbrauch minimal.
- Werte lesen via
for-in,list()odernext(). - Einmal erschöpft, müssen Generatoren für Wiederverwendung neu erstellt werden.
- Yield übertrifft return bei großen oder Streaming-Daten.
Python
- Python Lambda-Funktionen: Praxisleitfaden zu anonymen Funktionen
- Python Generatoren: Effiziente Iteration und fortgeschrittene Anwendungsfälle
- Python Closures erklärt: Wie verschachtelte Funktionen Variablen erfassen
- Python Decorators meistern: Funktionen mit Experten-Techniken erweitern
- Pythons strip()-Methode meistern: Umfassender Leitfaden & Praxisbeispiele
- Python len(): Praktischer Leitfaden zur Messung von Objektlängen
- Python Lambda-Funktionen meistern: Praxisbeispiele & Best Practices
- Python round()-Funktion erklärt mit praktischen Beispielen
- Pythons map()-Funktion meistern: Syntax, Beispiele und Best Practices
- Python Counter in collections: Effizientes Zählen, Aktualisieren und arithmetische Operationen