Wyjaśnienie lekcji
Po tej lekcji będziesz potrafić:
sum(), any() lub all() bez tworzenia listy pośredniej.Wyrażenie listowe od razu tworzy listę wyników:
adjusted = [score + 5 for score in scores]Wyrażenie generatorowe używa nawiasów okrągłych zamiast kwadratowych. Opisuje wartości, które będą produkowane, gdy iterator o nie poprosi, zamiast od razu tworzyć listę wyników:
adjusted = (score + 5 for score in scores)Używaj go, gdy operacja może przetwarzać wartości jedna po drugiej — na przykład sum(), any() lub all(). Wyrażenie możesz przekazać bezpośrednio do funkcji. Przy pojedynczym argumencie generatora zewnętrzne nawiasy generatora często można pominąć: sum(x * 2 for x in values).
W odróżnieniu od listy, generator jest jednoprzebiegowy. Po jego zużyciu ponowna iteracja po tym samym generatorze nie daje żadnych wartości. Jeśli potrzebujesz wartości wiele razy, użyj wyrażenia listowego, zmaterializuj generator za pomocą list() lub utwórz nowy generator dla każdego przebiegu.
any() i all() mogą zatrzymać się wcześniej: any() zatrzymuje się na pierwszym elemencie prawdziwym, a all() na pierwszym fałszywym. Zasady dla pustych danych pozostają takie jak w poprzedniej lekcji (any jest fałszywe; all jest prawdziwe). Wyrażenia generatorowe szczególnie naturalnie pasują do sprawdzeń jednoprzebiegowych.
base_prices = [12, 20, 8]
total = sum(price * 2 for price in base_prices)
print(f"Total: {total}")Wynik:
Total: 80Mnożenie jest obliczane, gdy sum() prosi o kolejny element; osobna lista podwojonych cen nie jest potrzebna.
readings = [18, -1, 24, 0]
valid_total = sum(value for value in readings if value >= 0)
print(valid_total)Wynik:
42if wyłącza z obliczeń nieprawidłowe ujemne odczyty, zachowując poprawne zero.
labels = ["ready", "paused", "ready"]
has_pause = any(label == "paused" for label in labels)
print(f"Paused: {has_pause}")Wynik:
Paused: Trueany() może zakończyć działanie, gdy tylko generator dostarczy jedno dopasowanie.
values = (part.upper() for part in ["a", "b"])
print(list(values))
print(list(values))Wynik:
['A', 'B']
[]Drugi przebieg jest pusty, ponieważ values zostało zużyte. Użyj listy, jeśli oba przebiegi mają zawierać wyniki.
| Potrzeba | Preferowane podejście |
|---|---|
| Zachowanie wyników do ponownego użycia | [expression for item in items] |
| Jednokrotne przetworzenie wyników | (expression for item in items) |
| Agregacja wartości | sum(expression for item in items) |
| Sprawdzenie co najmniej jednego dopasowania | any(predicate for item in items) |
| Sprawdzenie każdej wartości | all(predicate for item in items) |
| Ponowne użycie wyników później | Zmaterializuj za pomocą list(...) lub utwórz generator od nowa |
all() na pustym generatorze jako dowodu, że partia zawierała sprawdzenia.sum(), any() lub all(), gdy generator jest czytelniejszy.