Was macht das yield-Keyword in Python?

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:

  1. Pause und Fortsetzung: Wenn die Funktion, die yield verwendet, aufgerufen wird, wird sie nicht vollständig ausgeführt. Stattdessen wird sie bei jedem yield pausiert und gibt den Wert zurück, der dem yield folgt. Bei erneutem Aufruf des Generators (über die next()-Funktion oder in einer Schleife) wird die Ausführung fortgesetzt, bis zum nächsten yield oder bis die Funktion endet.
  2. 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.
  3. Beenden: Wenn die Generator-Funktion keine weiteren Werte mehr zu liefern hat (d.h. sie endet oder trifft auf ein return-Statement), wird sie einen StopIteration-Fehler werfen. Dies signalisiert dem aufrufenden Code, dass keine weiteren Werte verfügbar sind.
  4. https://www.traditionrolex.com/47

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.