Scripting

Comprehensions und Generatoren

List-, Set- und Dict-Comprehensions, Generator-Funktionen, yield, Iteratoren und Lazy Evaluation.

Comprehensions und Generatoren

Comprehensions und Generatoren sind typische Python-Werkzeuge, um Daten kompakt und lesbar zu erzeugen oder zu verarbeiten.

Comprehensions

Eine Comprehension beschreibt eine Datenstruktur deklarativ.

Beispiel aus der Mengenlogik:

T = {x | 1 <= x <= 5 und x in S}

In Python:

s = {2, 3, 5, 7, 9, 11}
t = {x for x in range(1, 6) if x in s}

Ergebnis:

{2, 3, 5}

List-Comprehension

quadrate = [x * x for x in range(1, 6)]

Mit Bedingung:

gerade_quadrate = [x * x for x in range(1, 10) if x % 2 == 0]

Set-Comprehension

zeichen = {c.lower() for c in "Hello World" if c.isalpha()}

Sets entfernen automatisch Duplikate.

Dict-Comprehension

u = [2, 3, 4, 6]
v = {k: list(range(k)) for k in u}

Ergebnis:

{
    2: [0, 1],
    3: [0, 1, 2],
    4: [0, 1, 2, 3],
    6: [0, 1, 2, 3, 4, 5]
}

Verschachtelte Comprehensions

t = {2, 3, 5}
u = [b * a for a in range(1, 3) for b in t if b < 5]

Verschachtelte Comprehensions können elegant sein, aber auch schnell unlesbar werden.

Faustregel: Wenn man lange überlegen muss, lieber eine normale Schleife verwenden.

Generatoren

Generatoren erzeugen Werte bei Bedarf.

def lazygen(string):
    for char in string:
        yield f"lazy ... {char}"

Verwendung:

for s in lazygen("abc"):
    print(s)

yield verwandelt die Funktion in einen Generator.

yield vs. return

return beendet eine Funktion sofort.

def non_lazy(string):
    for char in string:
        return f"lazy ... {char}"

Diese Funktion gibt beim ersten Zeichen zurück und ist danach fertig.

yield gibt einen Wert zurück und merkt sich den Zustand für den nächsten Durchlauf.

Generator-Comprehension

gen = (x * x for x in range(10))

Generator-Comprehensions verwenden runde Klammern.

Bei einem einzelnen Funktionsargument können die Klammern manchmal entfallen:

sum(x * x for x in range(10))

Lazy Evaluation

Generatoren sind lazy. Sie berechnen Werte erst, wenn sie gebraucht werden.

Vorteile:

  • weniger Speicherverbrauch
  • gut für große Datenmengen
  • gut für Streams und Dateien
  • Verarbeitung kann früh abbrechen

Nachteil:

  • Werte sind nicht sofort alle vorhanden
  • ein Generator ist nach Verbrauch leer
  • Debugging kann ungewohnter sein

Merksatz

Comprehensions bauen Datenstrukturen kompakt. Generatoren liefern Werte nach Bedarf.

Zuletzt aktualisiert: 6. Juni 2026