Wyrażenia generatorowe
Pisz zwięzłe, leniwe potoki
Wyrażenia generatorowe to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.
Od list comprehension do wyrażenia generatorowego
Wyrażenie generatorowe wygląda jak list comprehension, ale używa nawiasów okrągłych zamiast kwadratowych. Tworzy wartości leniwie, zamiast budować całą listę.
list_comp = [x * x for x in range(5)]
gen_expr = (x * x for x in range(5))
print(list_comp)
print(gen_expr)
print(list(gen_expr))Różnica w zużyciu pamięci
List comprehension tworzy w pamięci wszystkie elementy od razu. Wyrażenie generatorowe przechowuje niemal nic, dopóki nie zażądasz wartości. Porównaj rozmiary obu rozwiązań.
import sys
lst = [x for x in range(10000)]
gen = (x for x in range(10000))
print('list bytes:', sys.getsizeof(lst))
print('gen bytes:', sys.getsizeof(gen))Iterowanie po wyrażeniu generatorowym
Wyrażenie generatorowe zużywa się tak jak każdy iterator: za pomocą pętli for, next() lub przez przekazanie go do funkcji.
gen = (c.upper() for c in 'hello')
for ch in gen:
print(ch)Filtrowanie za pomocą if
Dodaj klauzulę if, aby zachować tylko pasujące elementy — dokładnie tak jak w list comprehension.
evens = (n for n in range(10) if n % 2 == 0)
print(list(evens))Bezpośrednie przekazywanie do funkcji
Gdy wyrażenie generatorowe jest jedynym argumentem funkcji, można pominąć dodatkowe nawiasy. To przejrzyste rozwiązanie pozwala uniknąć tworzenia tymczasowej listy.
total = sum(x * x for x in range(5))
print(total)
biggest = max(len(w) for w in ['a', 'abc', 'ab'])
print(biggest)Przypomnienie: użycie tylko raz
Wyrażenie generatorowe wyczerpuje się po jednym przejściu, tak jak funkcja generatora. Podczas drugiego iterowania nie zwróci już żadnych wartości.
gen = (x for x in range(3))
print(list(gen))
print(list(gen))Łączenie wyrażeń
Jedno wyrażenie generatorowe można przekazać do kolejnego, tworząc leniwy potok. Żadne obliczenia nie są wykonywane, dopóki końcowy odbiorca nie pobierze wartości.
nums = (n for n in range(10))
evens = (n for n in nums if n % 2 == 0)
doubled = (n * 2 for n in evens)
print(list(doubled))any() i all()
Wyrażenia generatorowe świetnie współpracują z any() i all(), ponieważ mogą kończyć działanie wcześniej i zatrzymać się, gdy tylko wynik stanie się znany.
words = ['cat', 'dog', 'elephant']
print(any(len(w) > 5 for w in words))
print(all(len(w) >= 3 for w in words))Zagnieżdżone pętle
Tak jak list comprehension, wyrażenia generatorowe obsługują wiele klauzul for, odczytywanych od lewej do prawej.
pairs = ((x, y) for x in range(2) for y in range(2))
print(list(pairs))Przykład leniwego potoku
Oto niewielki potok do przetwarzania tekstu. Każdy etap działa leniwie, więc można przetwarzać nawet ogromny plik strumieniowo, bez wczytywania go w całości.
lines = [' alpha ', '', ' beta', 'gamma ']
stripped = (line.strip() for line in lines)
nonempty = (line for line in stripped if line)
print(list(nonempty))Kiedy wybrać które rozwiązanie
List comprehension należy użyć, gdy dane będą potrzebne wielokrotnie lub wymagany jest dostęp za pomocą indeksu. Wyrażenie generatorowe sprawdzi się przy jednokrotnym przetwarzaniu strumieniowym lub dużych zbiorach danych.
data = range(6)
as_list = [x + 1 for x in data]
print(as_list[0], as_list[-1])
total = sum(x + 1 for x in data)
print(total)Szybkie sprawdzenie
Sprawdź swoją znajomość wyrażeń generatorowych.
Podsumowanie
Poznałeś(-aś) wyrażenia generatorowe:
- Nawiasy okrągłe pozwalają utworzyć leniwą alternatywę dla list comprehension.
- Oszczędzają pamięć i obsługują filtry
iforaz zagnieżdżone pętle. - Dobrze współpracują z
sum,any,alli łączeniem wyrażeń. - Można ich użyć tylko raz.
Następnie poznasz komponowanie generatorów za pomocą yield from.
Ucz się Python dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 76
- Lekcje
- 320
Często zadawane pytania
Czy lekcja „Wyrażenia generatorowe” jest bezpłatna?
Tak — pełny tekst „Wyrażenia generatorowe” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wyrażenia generatorowe”?
Pisz zwięzłe, leniwe potoki Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Python Academy?
Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Wyrażenia generatorowe”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?
Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Protokół iteratora
- Funkcje generatorów
- Wyrażenia generatorowe
- yield from i delegowanie