Instruktor: Cześć i witam ponownie.
W tym filmie mówimy o
klasach generatorów i iteratorach.
Tutaj pokażę ci klasę, która implementuje generator
100 liczb, który zrobiliśmy w ostatnim filmie.
Nazwę ją więc FirstHundredGenerator.
W ten sposób zdefiniujemy metodę init.
Który po prostu rozpocznie liczbę od zera,
a następnie zdefiniujemy metodę next underscore,
underscore, next.
Po zdefiniowaniu metody next w klasie, każdy
obiekt można następnie wywołać next mojego obiektu, na przykład.
Jest to więc ponownie metoda dunder,
która pozwala wywołać na niej next.
Mówi też Pythonowi coś bardzo ważnego.
Przyjrzymy się temu za chwilę.
Tak więc, jeśli chcemy wygenerować 100 liczb, wszystko co
musimy zrobić, to zdobyć siebie. zwraca liczbę
i zwiększa ją o jeden.
Tak więc, jeśli self. liczba jest mniejsza niż 100,
nie użyjemy tutaj słowa kluczowego yield,
ponieważ nie jest ono potrzebne w generatorze klas.
Przepraszam, w jednej z tych rzeczy. (śmiech) Po prostu
nie powiem nic, co mogłoby zostać
źle odebrane.
Żeby cię nie zmylić.
Jeśli liczba jest mniejsza niż 100,
umieszczamy ją w zmiennej,
zwiększamy liczbę o jeden, a następnie zwracamy bieżącą
liczbę, która była poprzednią wartością, czyli zero.
Zwiększamy siebie. o jeden, zwracamy zero.
Dobrze.
Teraz ważne na klasie
musimy, jeśli chcemy zatrzymać
zwracanie liczb,
tak jak tutaj, nie używamy pętli, aby zatrzymać
nas, gdy osiągniemy 100.
Tak więc, gdy osiągniemy 100, musimy zgłosić specjalny
błąd, który nazywa się Stop Iteration.
Błąd Stop Iteration informuje Pythona,
że osiągnęliśmy koniec tego generatora.
Mówię generator i lekko się wzdrygam.
Ponieważ jest to zasadniczo generator, w którym zaczynasz
od zera, następnie decydujesz,
czy chcesz zwrócić nową liczbę, otrzymujesz tę liczbę, a następnie
ją zwracasz, a następnie program się
zatrzymuje.
Ale twój obiekt pozostaje i pamięta siebie. numer.
Tak więc, jeśli mamy mój generator, a to jest nasza pierwsza
setka generatorów.
Mój gen. wynosi oczywiście
zero na początku.
Prawda?
Pokażmy ci to.
Mój gen to liczba zero na początku.
Jeśli zrobisz mój gen. a następnie wydrukować
mój gen. numer ponownie, otrzymujesz
jeden.
To ma sens, prawda?
Ponieważ następną metodą jest sprawdzenie, czy liczba jest
mniejsza niż 100, a następnie
zwiększenie jej o jeden.
Więc to wszystko ma sens.
Teraz, aby zachowywał się jak generator,
po prostu mówimy next of my gen, w ten sposób.
Następnie możemy uruchomić to ponownie i wyjdzie to samo.
Oczywiście, następny z moich
genów zwraca liczbę, którą miał przed inkrementacją.
Więc zamiast drukować mój gen. numer tutaj, możemy po prostu wydrukować
następny z mojego genu, a tutaj możemy również wydrukować
następny z mojego genu, a otrzymamy te same dane
wyjściowe, zero i jeden.
Przy pierwszym wywołaniu next otrzymujemy bieżącą wartość, która
wynosi zero, ale zwiększyliśmy wartość self. o jeden.
Następnym razem, gdy wywołamy
next, ponownie zwiększymy tę liczbę o jeden, ale
zwrócimy poprzednią wartość, czyli jeden.
Więc teraz zachowuje się dokładnie jak generator
i rzeczywiście jest to generator.
Nie przechowuje wszystkich wartości do 100 na liście.
Daje ci je jeden po drugim.
Generuje je podczas wywoływania następnej funkcji.
Przepraszam, następna metoda.
Przy okazji, dunder next jest nowością w Pythonie trzecim.
Jeśli więc używasz Pythona
dwa, będziesz musiał zdefiniować next bez podkreślenia.
To tylko dla Python dwa.
Jeśli używasz Pythona, użyj następnie dunder.
Wszystkie obiekty,
które posiadają metodę dunder next nazywane są iteratorami.
Wszystkie generatory, takie jak ten, są iteratorami,
ale nie na odwrót.
Można więc mieć iteratory, które nie generują liczb.
Na przykład, jeśli zmodyfikujesz swój generator
liczb pierwszych, aby zwracał część listy, taką jak iterator
pierwszej setki, a nie generator, możesz mieć tutaj metodę
init, która mówi self.
Liczby
to: jeden, dwa, trzy, cztery, pięć.
Oczywiście to nie jest pierwsza
setka, to jest pierwsza piątka iteratora, self I to zero.
Więc to jest indeks, który zaczniesz zwracać.
Zero, a liczby, które zwracamy,
to od jednego do pięciu.
Z drugiej strony, następna metoda powie po prostu, czy I jest mniejsze
niż len of self. numbers, return
self. liczby I.
Prawda?
W przeciwnym razie zatrzymaj iterację.
Niestety, nie widać tego tak dobrze, ale proszę
bardzo.
Więc wszystko, co tutaj robimy, to nic nie generujemy.
Mówimy, że jeśli I jest mniejsze
niż, przy okazji musimy, oczywiście, że musimy to zrobić,
I plus równe jeden i zwrócić
prąd.
Musimy inkrementować jeden i oczywiście
musimy inkrementować I o jeden.
Ponownie, nie generujemy nowych liczb.
Śledzimy I, indeks, na którym obecnie się znajdujemy,
musisz to zrobić w jakiś sposób, aby, to powinno
być samo. A tak przy okazji.
Można powiedzieć, że tak naprawdę nie przygotowałem tego przykładu,
ale chciałem tylko szybko pokazać,
że nie wszystkie generatory, nie wszystkie iteratory,
muszą być generatorami.
W tym przypadku nie generujesz liczb,
ale zwracasz je z listy.
To tylko krótki przykład.
Będzie to dostępne w przykładowym kodzie sekcji,
o ile będę pamiętał o dodaniu go.
Tak więc to, co robimy, gdy definiujemy metodę next, to definiujemy
iterator, coś, co
można przejść jeden po drugim, wywołując
funkcję next.
Niekoniecznie musi generować wszystkie swoje liczby,
ale może, ale może też zwrócić je z listy, wysłane lub
gdziekolwiek indziej.
Tak więc w Pythonie jest to ważne.
Iteratory to obiekty, które posiadają
metodę dunder next.
Możesz zadzwonić do nich w następnej kolejności.
Mamy iterator, ale
nie możemy
zrobić dla I w
moim gen, w moim gen.
Nie możesz tego zrobić.
Powiem ci to teraz.
Jeśli to uruchomimy, otrzymamy błąd, który mówi, że obiekt
generatora first 100 nie jest iterowalny, ale
właśnie powiedziałem, że jest iteratorem i jest iteratorem.
Iterator oznacza, że można wywołać
na nim funkcję next, która
poda następną wartość.
Ale iterator i iterable to różne rzeczy.
Można iterować po iterable, a iterator
służy do pobierania następnej wartości z sekwencji lub
z wygenerowanych wartości.
Mamy więc tutaj iterator,
a nie iterable.
W następnym filmie dowiemy się,
jak utworzyć iterable, abyśmy
mogli nad nim zapętlić lub rzeczywiście
robić takie rzeczy, jak suma mojego genu lub wiesz,
cokolwiek chcesz zrobić.
Lista moich gen.
Te rzeczy tutaj wymagają iterable, a nie iteratora.
Zróbmy to w następnym filmie.
Do zobaczenia na miejscu.