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.
Ü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.
# 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 elementsMemory 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
Erfahren Sie, wie Sie Listenverständnisse in Python verwenden. Schreiben Sie prägnante Schleifen, wenden Sie bedingte Filter an und erstellen Sie Matrizen mit klarer visueller Syntax.
So verwenden Sie Kontextmanager in PythonErfahren Sie, wie Kontextmanager in Python funktionieren. Beherrschen Sie die with-Anweisung, verwalten Sie Systemressourcen und schreiben Sie benutzerdefinierte Kontextmanager.
Empfohlene Python-Ressourcen
Erweitern Sie Ihr Wissen mit zugehörigen interaktiven Tutorials, Spickzetteln und Codevergleichen.
Python-Generatoren
Erfahren Sie, wie Sie Python-Generatoren und Yield-Anweisungen verwenden, um große Datensätze mit minimalem Speicherbedarf zu verarbeiten. Master-Generator-Ausdrücke.
Spickzettel für Python-String-Methoden
Ein vollständiges Referenzhandbuch für die Python-String-Manipulation. Meistern Sie das Formatieren, Suchen, Teilen, Ersetzen und Überprüfen von Zeichenfolgeneigenschaften.
Python vs. JavaScript: Welche Programmiersprache ist die beste?
Ein umfassender Vergleich zwischen Python und JavaScript. Entdecken Sie Syntaxunterschiede, Leistung, Anwendungsfälle (Backend vs. Frontend) und Codierungsbeispiele.