510
Rozdział 12.
Musisz pokoch generatory
Używanie generatora do przetwarzania URL-i
Poniżej znajdziesz przykład zaprezentowany na poprzedniej stronie przerobiony w taki sposób,
aby wykorzystywał generator. Wykonanie odpowiedniej zmiany jest bardzo proste wystarczy
tu tylko zastąpić nawiasy kwadratowe komprehencji listy nawiasami okrągłymi.
Istotna zmiana: nawiasy
kwadratowe zostały
zastąpione nawiasami
okrągłymi.
Krótko po wprowadzeniu powyższej pętli
for
na ekranie pojawia się pierwszy wynik.
Następnie, chwilę później, na ekranie pojawia się drugi wiersz wyników.
Następnie — na koniec po kolejnej chwili na ekranie pojawia się ostatni wiersz wyników (a pętla
for
kończy swoje działanie).
Odpowiedź dla pierwszego URL-a
Odpowiedź dla drugiego URL-a
Odpowiedź dla trzeciego
(i ostatniego) URL-a
jesteś tutaj
511
Zaawansowana iteracja
Używanie generatora: co się właśnie stało?
Jeśli porównasz wyniki wytworzone przez komprehencję listy do tych otrzymanych w wyniku działania
generatora, okaże się, że one
identyczne. Jednak zachowanie tych dwóch konstrukcji takie nie jest.
Komprehencja listy
czeka
na wytworzenie wszystkich swoich danych przed przekazaniem
czegokolwiek oczekującej pętli
for
, podczas gdy generator
uwalnia
dane od razu, gdy tylko staną się
dostępne. Oznacza to, że pętla
for
wykorzystująca generator jest znacznie bardziej responsywna niż
analogiczna pętla, w której użyto komprehencji listy (sprawiającej, że czekasz).
Jeśli wydaje Ci się, że nie ma to wielkiego znaczenia, wyobraź sobie, że krotka z URL-ami zawiera
sto, tysiąc lub milion elementów. Dalej, wyobraź sobie, że kod przetwarzający odpowiedź przekazuje
zmodyfikowane dane innemu procesowi (na przykład oczekującej bazie danych). Wraz ze wzrostem
liczby URL-i zachowanie kodu wykorzystującego komprehencję listy staje się coraz gorsze
w porównaniu z tym, jak działa kod używający generatora.
A więc... czy to oznacza,
że zawsze powinienem
używać generatora zamiast
komprehencji listy?
Nie. Tego byśmy nie powiedzieli.
Nie zrozum nas źle: to, że istnieją generatory, jest
wspaniałe, ale nie oznacza, że powinieneś zastąpić
swoje wszystkie komprehencje listy odpowiadającymi
im generatorami. Podobnie jak z innymi kwestiami
dotyczącymi programowania, również tutaj
wybór właściwego sposobu mocno zależy od tego,
co próbujesz zrobić.
Jeśli możesz sobie pozwolić na oczekiwanie, wówczas
komprehencje listy w porządku; w innym razie
rozważ zastosowanie generatora.
Interesującym zastosowaniem generatora jest osadzenie
go wewnątrz funkcji. Przyjrzyjmy się sposobowi
umożliwiającemu hermetyzację w funkcji utworzonego
przez nas właśnie generatora.

Get Python Rusz głową! Wydanie II now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.