Co to są iteratory

W Pythonie iterator to obiekt, po którym można „przechodzić krok po kroku”, zwykle za pomocą pętli for.
Każdy kolejny krok nazywa się iteracją.

Można to porównać do:

  • czytania książki strona po stronie,

  • wyjmowania kartek z pudełka jedna po drugiej,

  • sprawdzania elementów listy od początku do końca.

Większość struktur danych w Pythonie — takich jak listy, napisy czy słowniki — jest iterowalna, czyli może zwrócić iterator.

Iterator:

  • pamięta swoją aktualną pozycję,

  • zwraca kolejny element przy każdym wywołaniu next()

  • kończy działanie zgłaszając wyjątek StopIteration.

Jak działa iterator?

Każdy obiekt iterowalny może

  1. utworzyć iterator za pomocą funkcji iter(),

  2. zwrócić kolejne elementy za pomocą next().

To właśnie pętla for używa iteratorów w tle, choć tego nie widzimy.

Przykład 1

Ręczne użycie iteratora

Linia 1. liczby znak równości otwórz nawias kwadratowy 10 przecinek 20 przecinek 30 zamknij nawias kwadratowy. Linia 3. it znak równości iter otwórz nawias okrągły liczby zamknij nawias okrągły kratka tworzenie iteratora. Linia 5. print otwórz nawias okrągły next otwórz nawias okrągły it zamknij nawias okrągły zamknij nawias okrągły kratka 10. Linia 6. print otwórz nawias okrągły next otwórz nawias okrągły it zamknij nawias okrągły zamknij nawias okrągły kratka 20. Linia 7. print otwórz nawias okrągły next otwórz nawias okrągły it zamknij nawias okrągły zamknij nawias okrągły kratka 30. Linia 9. kratka print otwórz nawias okrągły next otwórz nawias okrągły it zamknij nawias okrągły zamknij nawias okrągły tutaj byłby wyjątek StopIteration.
Przykład 2

Własny iterator (prosty licznik)

Tworzymy klasę, która potrafi być iteratorem, bo ma dwie metody:

  • __iter__() -  zwraca siebie

  • __next__() -  zwraca kolejną wartość

Linia 1. class Licznik dwukropek. Linia 2. def podkreślnik podkreślnik init podkreślnik podkreślnik otwórz nawias okrągły self przecinek limit zamknij nawias okrągły dwukropek. Linia 3. self kropka limit znak równości limit. Linia 4. self kropka current znak równości 0. Linia 6. def podkreślnik podkreślnik iter podkreślnik podkreślnik otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 7. return self. Linia 9. def podkreślnik podkreślnik next podkreślnik podkreślnik otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 10. if self kropka current otwórz nawias ostrokątny self kropka limit dwukropek. Linia 11. self kropka current plus znak równości 1. Linia 12. return self kropka current. Linia 13. else dwukropek. Linia 14. raise StopIteration. Linia 16. kratka użycie. Linia 17. for n in Licznik otwórz nawias okrągły 5 zamknij nawias okrągły dwukropek. Linia 18. print otwórz nawias okrągły n zamknij nawias okrągły. Linia 19. apostrof apostrof apostrof. Linia 20. Wyniki. Linia 21. 1. Linia 22. 2. Linia 23. 3. Linia 24. 4. Linia 25. 5. Linia 26. apostrof apostrof apostrof.
Przykład 3

Inny sposób— generator (prostszy sposób)

To samo można zapisać łatwiej korzystając generatora funkcji.

yield to specjalna instrukcja w Pythonie używana w generatorach.
Generator to funkcja, która zwraca kolejne wartości w trakcie działania, zamiast zwracać całą listę naraz.

Główne cechy yield:

  1. Zatrzymuje działanie funkcji w miejscu yield, pamiętając stan zmiennych.

  2. Zwraca wartość do miejsca wywołania (np. do pętli for).

  3. Pozwala wznowić funkcję od miejsca zatrzymania przy kolejnym wywołaniu next().

Linia 1. def licznik otwórz nawias okrągły limit zamknij nawias okrągły dwukropek. Linia 2. i znak równości 0. Linia 3. while i otwórz nawias ostrokątny limit dwukropek. Linia 4. i plus znak równości 1. Linia 5. yield i. Linia 7. for n in licznik otwórz nawias okrągły 5 zamknij nawias okrągły dwukropek. Linia 8. print otwórz nawias okrągły n zamknij nawias okrągły.