Python Academy · Lekcja

Wyrażenia generatorowe

Pisz zwięzłe, leniwe potoki

Lekcja 3 z 413 kroki

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 if oraz zagnieżdżone pętle.
  • Dobrze współpracują z sum, any, all i łączeniem wyrażeń.
  • Można ich użyć tylko raz.

Następnie poznasz komponowanie generatorów za pomocą yield from.

Bezpłatny start

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

  1. Protokół iteratora
  2. Funkcje generatorów
  3. Wyrażenia generatorowe
  4. yield from i delegowanie
← Powrót do Python Academy