Lektion 31 von 35Python
Python · Lektion 31 · 25 Minuten
Generatoren und yield
Das lernst du
- Funktionen mit
yieldschreiben - Verstehen, warum Generatoren Speicher sparen
- Generatoren mit
next(),forundsum()benutzen
Werte nacheinander liefern
Eine normale Funktion gibt mit return einen Wert zurück und ist dann fertig. Ein Generator benutzt yield: Er liefert einen Wert, pausiert – und macht beim nächsten Mal genau dort weiter.
def countdown(start):
while start > 0:
yield start
start -= 1
yield "Start!"
for wert in countdown(3):
print(wert)Drück auf Schritte: Du siehst, wie Python zwischen der Schleife und dem Generator hin- und herspringt.
Schritt für Schritt mit next()
Mit next() holst du dir den nächsten Wert selbst ab:
def farben():
yield "rot"
yield "gelb"
yield "grün"
ampel = farben()
print(next(ampel))
print(next(ampel))
print(next(ampel))Ein weiteres next(ampel) würde einen StopIteration-Fehler auslösen – der Generator ist leer.
Warum Generatoren?
Eine Liste mit einer Million Zahlen braucht viel Speicher. Ein Generator rechnet jede Zahl erst aus, wenn sie gebraucht wird. Mit runden Klammern gibt es sogar Generator-Ausdrücke:
summe = sum(x * x for x in range(1_000_000))
print(summe)Keine Liste wird gebaut – trotzdem kommt das richtige Ergebnis heraus.
Merke: Siehst du
yieldin einer Funktion, ist sie ein Generator. Generatoren kannst du infor-Schleifen, mitlist(),sum()odernext()benutzen.
Kurz-Check
Bevor es an die Aufgabe geht: Was gibt dieses Programm aus? Tipp deine Vermutung ein – Python rechnet danach nach.
def quadrate(n):
for i in range(n):
yield i * i
g = quadrate(4)
print(next(g), next(g))
print(list(g))Deine Aufgabe
Jetzt bist du dran
Schreib einen Generator fibonacci(n), der die ersten n Fibonacci-Zahlen liefert: 0, 1, 1, 2, 3, 5, 8, … (jede Zahl ist die Summe der beiden davor). Benutze yield – keine Liste.
def fibonacci(n):
# a und b sind die beiden letzten Zahlen
a, b = 0, 1
# liefere n Zahlen mit yield
print(list(fibonacci(10)))- Denkanstoß
Liefere zuerst a, dann rechne a, b
=b, a+b weiter. - Welcher Befehl hilft?
Ein Generator benutzt
yieldstattreturn. - Lückencode – ergänze die ___
def fibonacci(n): # a und b sind die beiden letzten Zahlen a, b = 0, 1 for _ in ___: ___ a, b = ___ print(list(fibonacci(10)))
Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.
Lösung anzeigen🔒 Erst nach allen Hinweisen oder 2 Prüf-Versuchen
Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:
def fibonacci(n):
# a und b sind die beiden letzten Zahlen
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
print(list(fibonacci(10)))