Zum Inhalt springen
BetaEN
Lektion 31 von 35Python

Python · Lektion 31 · 25 Minuten

Generatoren und yield

Das lernst du

  • Funktionen mit yield schreiben
  • Verstehen, warum Generatoren Speicher sparen
  • Generatoren mit next(), for und sum() 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 yield in einer Funktion, ist sie ein Generator. Generatoren kannst du in for-Schleifen, mit list(), sum() oder next() 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)))

Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.

Lösung anzeigen

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)))