Erklärung zur Lektion
Nach dieser Lektion kannst du:
sum(), any() oder all() verwenden, ohne eine Zwischenliste zu erstellen.Eine List Comprehension erzeugt sofort eine Liste mit Ergebnissen:
adjusted = [score + 5 for score in scores]Ein Generatorausdruck verwendet runde statt eckiger Klammern. Er beschreibt Werte, die erzeugt werden, wenn ein Iterator sie anfordert, statt die Ergebnisliste sofort zu erstellen:
adjusted = (score + 5 for score in scores)Verwende ihn, wenn eine Operation Werte nacheinander verarbeiten kann – zum Beispiel sum(), any() oder all(). Du kannst den Ausdruck direkt an eine Funktion übergeben. Bei einem einzelnen Generator-Argument lassen sich die äußeren Klammern des Generators oft weglassen: sum(x * 2 for x in values).
Anders als eine Liste lässt sich ein Generator nur einmal durchlaufen. Nachdem du ihn verbraucht hast, liefert die erneute Iteration über denselben Generator keine Werte mehr. Wenn du die Werte mehrmals brauchst, verwende eine List Comprehension, materialisiere den Generator mit list() oder erstelle für jeden Durchlauf einen neuen Generator.
any() und all() können frühzeitig stoppen: any() stoppt beim ersten Truthy-Element und all() beim ersten Falsy-Element. Die Regeln für leere Eingaben bleiben wie in der vorherigen Lektion (any ist falsch; all ist wahr). Generatorausdrücke passen besonders gut zu Prüfungen mit nur einem Durchlauf.
base_prices = [12, 20, 8]
total = sum(price * 2 for price in base_prices)
print(f"Total: {total}")Ausgabe:
Total: 80Die Multiplikation wird ausgewertet, sobald sum() jedes Element anfordert; eine separate Liste verdoppelter Preise ist nicht nötig.
readings = [18, -1, 24, 0]
valid_total = sum(value for value in readings if value >= 0)
print(valid_total)Ausgabe:
42Das if hält ungültige negative Messwerte aus der Berechnung heraus und bewahrt eine gültige Null.
labels = ["ready", "paused", "ready"]
has_pause = any(label == "paused" for label in labels)
print(f"Paused: {has_pause}")Ausgabe:
Paused: Trueany() kann enden, sobald der Generator einen Treffer liefert.
values = (part.upper() for part in ["a", "b"])
print(list(values))
print(list(values))Ausgabe:
['A', 'B']
[]Der zweite Durchlauf ist leer, weil values verbraucht wurde. Verwende eine Liste, wenn beide Durchläufe Ergebnisse enthalten sollen.
| Bedarf | Bevorzugter Ansatz |
|---|---|
| Ergebnisse für die Wiederverwendung behalten | [expression for item in items] |
| Ergebnisse einmal verarbeiten | (expression for item in items) |
| Werte aggregieren | sum(expression for item in items) |
| Mindestens einen Treffer prüfen | any(predicate for item in items) |
| Jeden Wert prüfen | all(predicate for item in items) |
| Ergebnisse später wiederverwenden | Mit list(...) materialisieren oder den Generator neu erstellen |
all() bei einem leeren Generator nicht als Beweis, dass ein Stapel Prüfungen enthielt.sum(), any() oder all() zu übergeben, wenn ein Generator klarer ist.