In Python wird das yield
-Keyword in Funktionen verwendet, um einen Generator zu erstellen. Ein Generator ist eine spezielle Art von Iterator, der nicht alle seine Werte auf einmal produziert und speichert, sondern sie bei Bedarf “on-the-fly” erzeugt. Dies kann besonders nützlich sein, wenn man mit großen Datenmengen arbeitet, die nicht alle auf einmal im Speicher gehalten werden können.
Das yield
-Keyword hat mehrere Eigenschaften und Verhaltensweisen:
- Pause und Fortsetzung: Wenn die Funktion, die
yield
verwendet, aufgerufen wird, wird sie nicht vollständig ausgeführt. Stattdessen wird sie bei jedemyield
pausiert und gibt den Wert zurück, der demyield
folgt. Bei erneutem Aufruf des Generators (über dienext()
-Funktion oder in einer Schleife) wird die Ausführung fortgesetzt, bis zum nächstenyield
oder bis die Funktion endet. - State-Behaltung: Generatoren behalten ihren Zustand zwischen den Aufrufen bei. Das bedeutet, dass lokale Variablen und der Ausführungszustand zwischen den einzelnen
yield
-Aufrufen erhalten bleiben. - Beenden: Wenn die Generator-Funktion keine weiteren Werte mehr zu liefern hat (d.h. sie endet oder trifft auf ein
return
-Statement), wird sie einenStopIteration
-Fehler werfen. Dies signalisiert dem aufrufenden Code, dass keine weiteren Werte verfügbar sind.
Ein einfaches Beispiel:
def count_up_to(n):
count = 1
while count <= n:
yield count
count += 1
gen = count_up_to(3)
print(next(gen)) # Ausgabe: 1
print(next(gen)) # Ausgabe: 2
print(next(gen)) # Ausgabe: 3
print(next(gen)) # Wird einen StopIteration-Fehler werfen
In diesem Beispiel erzeugt die count_up_to
-Funktion einen Generator, der Zahlen bis zu einem gegebenen Wert n
erzeugt. Mit jeder Iteration (oder jedem Aufruf von next()
) gibt der Generator die nächste Zahl aus, bis er den Wert n
erreicht hat.
In der Praxis sind Generatoren sehr nützlich für Aufgaben wie das Durchsuchen großer Dateien, das Erzeugen von Zahlenreihen oder andere Operationen, bei denen es ineffizient wäre, alle Ergebnisse im Voraus zu berechnen und zu speichern.