Verwendung von Generatoren in Python (Yield-Anweisung)

Erfahren Sie, wie Sie Generatoren in Python schreiben. Verstehen Sie das Schlüsselwort yield, Lazy Evaluation, Speicheroptimierung und vergleichen Sie Generatoren mit Listenstrukturen.

Probieren Sie diese Lösung im Editor aus

Übersicht

Wenn Sie mit riesigen Datensätzen, Protokolldateien oder unendlichen Datenströmen arbeiten, kann das gleichzeitige Laden aller Elemente in den Speicher (wie die Rückgabe einer großen Liste) leicht den System-RAM erschöpfen und Ihre Anwendung zum Absturz bringen. Python bietet eine brillante, speichereffiziente Lösung: Generatoren.

Ein Generator ist eine spezielle Art von Funktion, die einen Lazy-Iterator zurückgibt. Anstatt alle Werte auf einmal zu berechnen und zurückzugeben, liefert ein Generator die Werte nacheinander nach Bedarf. Der Hauptunterschied ist die „Yield“-Anweisung. Wenn eine Generatorfunktion „yield“ aufruft, pausiert sie ihren Ausführungsstatus (Variablen, Befehlszeiger) und gibt den zurückgegebenen Wert zurück. Wenn der nächste Wert angefordert wird, setzt die Funktion genau an der Stelle fort, an der sie angehalten hat.

Da Generatorberechnungen träge ausgeführt werden, verbrauchen sie unabhängig von der Datensatzgröße nahezu keinen Speicher. Python unterstützt auch Generatorausdrücke, die die Klammersyntax „(x für x in Daten)“ verwenden, um einfache Inline-Generatoren zu erstellen, ohne vollständige Funktionen zu deklarieren.

Code- und Ausführungsausgabe

Dieses Skript demonstriert das Generieren von Sequenzen mithilfe von Generatorfunktionen mit der Yield-Anweisung und Generatorausdrücken.

generators_demo.py
Versuchen Sie es im Editor
# 1. Generator function using yield
def count_up_to(limit):
    count = 1
    while count <= limit:
        yield count
        count += 1

# Instantiating the generator
counter = count_up_to(3)
print("Memory safe generator instantiated.")

# Fetching values manually
print("Next 1:", next(counter))
print("Next 2:", next(counter))
print("Next 3:", next(counter))

# 2. Iterating with a for loop (automatically handles StopIteration)
print("\n--- Looping over generator ---")
for num in count_up_to(4):
    print("Num:", num)

# 3. Generator expression (Shorthand syntax)
squares_gen = (x**2 for x in range(1, 4))
print("\nGenerator expression elements:")
print(list(squares_gen)) # Cast to list to print all elements
Terminal-Ausgabe
Memory safe generator instantiated.
Next 1: 1
Next 2: 2
Next 3: 3

--- Looping over generator ---
Num: 1
Num: 2
Num: 3
Num: 4

Generator expression elements:
[1, 4, 9]

Schrittweise Umsetzung

  • Definieren Sie eine Funktion mit dem Standardschlüsselwort def.
  • Verwenden Sie das Schlüsselwort yield anstelle von return, um Werte an den Iterator-Stream zurückzugeben.
  • Durchlaufen Sie den Generator mithilfe einer for-Schleife oder rufen Sie die integrierte Funktion next(gen) auf, um Werte zu extrahieren.
  • Verwenden Sie Generatorausdrücke (unter Verwendung von Klammern) für einfache, verzögerte Inline-Konvertierungen.

Häufig gestellte Fragen

Was ist der Hauptvorteil von Generatoren gegenüber Listen?

Speichereffizienz. Listen speichern alle Elemente gleichzeitig im RAM, während Generatoren bei Bedarf Elemente einzeln liefern, sodass Sie Datensätze verarbeiten können, die größer sind als der Gesamtspeicher Ihres Systems.

Was passiert, wenn einem Generator die Artikel ausgehen?

Python löst eine StopIteration-Ausnahme aus. Eine for-Schleife fängt diese Ausnahme automatisch ab, um die Schleife ordnungsgemäß zu verlassen, aber der manuelle Aufruf von next() bei einem erschöpften Generator löst die Ausnahme aus.

Verwandte Themen

Empfohlene Python-Ressourcen

Erweitern Sie Ihr Wissen mit zugehörigen interaktiven Tutorials, Spickzetteln und Codevergleichen.