Übersetzung: Einführung in Python-Generatoren für Anfänger
Hallo da, aufstrebender Python-Programmierer! Heute werden wir auf eine aufregende Reise in die Welt der Python-Generatoren aufbrechen. Keine Sorge, wenn du noch nie davon gehört hast – wir beginnen bei den Grundlagen und arbeiten uns nach oben. Am Ende dieses Tutorials wirst du wie ein Profi Generatoren erstellen!
Was sind Python-Generatoren?
Stelle dir vor, du liest ein wirklich langes Buch. Anstatt das ganze Buch auf einmal zu kopieren (was eine Menge Papier verschwenden würde!), könntest du nur eine Seite auf einmal lesen. So funktionieren Generatoren in Python!
Generatoren sind eine spezielle Art von Funktion, die es uns ermöglicht, eine Sequenz von Werten im Laufe der Zeit zu erzeugen, anstatt sie alle auf einmal zu berechnen und in den Speicher zu speichern. Sie sind wie magische Fabriken, die Werte auf Anfrage produzieren.
Warum Generatoren verwenden?
- Speichereffizienz: Generatoren sind speicherfreundlich. Sie speichern nicht alle Werte gleichzeitig im Speicher.
- Leistung: Sie können die Leistung deines Codes verbessern, insbesondere bei der Verarbeitung großer Datensätze.
- Einfachheit: Generatoren können deinen Code sauberer und lesbarer machen.
Lass uns einsteigen und sehen, wie sie funktionieren!
Erstellung von Generatoren
Es gibt zwei Hauptwege, um Generatoren in Python zu erstellen:
- Verwendung einer Generator-Funktion
- Verwendung eines Generator-Ausdrucks
Generator-Funktionen
Eine Generator-Funktion sieht genauso aus wie eine normale Funktion, verwendet aberInstead of the return
keyword, it uses yield
. Hier ist ein einfaches Beispiel:
def count_up_to(n):
i = 1
while i <= n:
yield i
i += 1
# Verwendung unseres Generators
for number in count_up_to(5):
print(number)
Ausgabe:
1
2
3
4
5
In diesem Beispiel ist count_up_to
eine Generator-Funktion. Jedes Mal, wenn sie einen Wert liefert, pausiert sie ihre Ausführung und merkt sich ihren Zustand. Beim nächsten Aufruf setzt sie fort, wo sie aufgehört hat.
Generator-Ausdrücke
Generator-Ausdrücke sind wie Listenverarbeitungen, aber mit Klammern anstelle von eckigen Klammern. Sie sind eine kompakte Möglichkeit, Generatoren zu erstellen. Hier ist ein Beispiel:
# Generator-Ausdruck
squares = (x**2 for x in range(5))
# Verwendung unseres Generators
for square in squares:
print(square)
Ausgabe:
0
1
4
9
16
Dieser Generator-Ausdruck erstellt eine Sequenz von quadratisierten Zahlen sofort, ohne sie alle gleichzeitig im Speicher zu speichern.
Ausnahmebehandlung in Generatoren
Generatoren können auch Ausnahmen behandeln, was ziemlich cool ist! Hier ist ein Beispiel:
def div_generator(a, b):
try:
result = a / b
yield result
except ZeroDivisionError:
yield "Kann nicht durch null teilen!"
# Verwendung unseres Generators
g = div_generator(10, 2)
print(next(g)) # Gibt aus: 5.0
g = div_generator(10, 0)
print(next(g)) # Gibt aus: Kann nicht durch null teilen!
In diesem Beispiel behandelt unser Generator优雅 die Situation, in der wir versuchen, durch null zu teilen.
Normale Funktion vs. Generator-Funktion
Lass uns eine normale Funktion mit einer Generator-Funktion vergleichen, um den Unterschied zu sehen:
# Normale Funktion
def get_squares(n):
squares = []
for i in range(n):
squares.append(i**2)
return squares
# Generator-Funktion
def gen_squares(n):
for i in range(n):
yield i**2
# Verwendung der normalen Funktion
print(get_squares(5)) # Gibt aus: [0, 1, 4, 9, 16]
# Verwendung der Generator-Funktion
for square in gen_squares(5):
print(square) # Gibt jeden Quadrat auf einer neuen Zeile aus
Die Hauptunterschiede sind:
- Speicherverwendung: Die normale Funktion erstellt und speichert alle Werte gleichzeitig, während der Generator sie einzeln produziert.
- Syntax: Die normale Funktion verwendet
return
, während der Generatoryield
verwendet. - Iteration: Der Generator kann direkt iteriert werden, während das Ergebnis der normalen Funktion zunächst in einer Variablen gespeichert werden muss.
Asynchrone Generatoren
Python 3.6 hat asynchrone Generatoren eingeführt, die wie reguläre Generatoren sind, aber für asynchrone Programmierung. Sie verwenden async def
und yield
:
import asyncio
async def async_gen():
for i in range(3):
await asyncio.sleep(1)
yield i
async def main():
async for item in async_gen():
print(item)
asyncio.run(main())
Dieses Beispiel simuliert eine asynchrone Operation, die Werte im Laufe der Zeit liefert.
Generator-Methoden
Generatoren haben einige spezielle Methoden, die recht nützlich sein können. Hier ist eine Tabelle der häufigsten:
Methode | Beschreibung |
---|---|
next() |
Holt den nächsten Eintrag aus dem Generator |
send() |
Sendet einen Wert in den Generator |
throw() |
Löst eine Ausnahme im Generator aus |
close() |
Schließt den Generator |
Hier ist ein kurzes Beispiel zur Verwendung von send()
:
def echo_generator():
while True:
received = yield
print(f"Empfangen: {received}")
g = echo_generator()
next(g) # Prime the generator
g.send("Hallo") # Gibt aus: Empfangen: Hallo
g.send("Welt") # Gibt aus: Empfangen: Welt
Und das ist es! Du hast gerade deine ersten Schritte in die wunderbare Welt der Python-Generatoren gemacht. Denke daran, dass Praxis macht den Meister, also mach keine Angst, mit diesen Konzepten zu experimentieren. Bevor du es weißt, wirst du Generatoren verwenden, um allerlei interessante Probleme in deinen Python-Programmen zu lösen. Happy coding!
Credits: Image by storyset