Treci la conținutul principal

Iteratori în Python

Gândește-te la un iterator ca la un obiect care conține un set numărabil de valori, pe care le poți parcurge pe rând, câte una, până le-ai trecut în revistă pe toate.

Ceea ce face ca un obiect să fie iterator în Python este o regulă numită protocolul iterator: obiectul trebuie să ofere două metode, __iter__() și __next__().


Iterator vs. iterabil

O listă, un tuplu, un dicționar sau o mulțime este un obiect iterabil: un container care îți poate da un iterator atunci când îi ceri unul.

Ca să ceri unul, transmite containerul funcției încorporate iter():

Exemplu

Obține un iterator dintr-un tuplu, apoi afișează-i valorile una câte una:
Prompt
Returnează un iterator dintr-un tuplu și afișează fiecare valoare folosind iter() și next(). Creează un tuplu cu "apple", "banana", "cherry".
Ieșire: program Python complet

Exemplu

Un șir funcționează la fel, pentru că este o secvență iterabilă de caractere:
Prompt
Parcurge caracterele șirului "banana" folosind iter() și next(). Afișează fiecare caracter, unul câte unul.
Ieșire: program Python complet

Parcurgerea unui iterator cu o buclă

O buclă for îți oferă o cale mai scurtă de a parcurge orice obiect iterabil:

Exemplu

Parcurge cu o buclă elementele unui tuplu:
Prompt
Parcurge valorile unui tuplu ("apple", "banana", "cherry") folosind o buclă for. Afișează fiecare valoare.
Ieșire: program Python complet

Exemplu

Parcurge cu o buclă un șir, câte un caracter pe rând:
Prompt
Parcurge caracterele șirului "banana" folosind o buclă for. Afișează fiecare caracter.
Ieșire: program Python complet

Crearea unui iterator

Propria ta clasă devine un iterator de îndată ce îi adaugi atât __iter__(), cât și __next__().

Capitolul Python Clase/Obiecte explică __init__(), funcția pe care o are fiecare clasă pentru a pregăti lucrurile în momentul în care este creat un obiect.

__iter__() are un rol asemănător: poate face operații de pregătire, dar valoarea pe care o returnează trebuie să fie întotdeauna chiar obiectul iterator.

Și __next__() poate executa operații, iar fiecare apel trebuie să returneze următorul element din secvență.

Exemplu

Creează un iterator care numără crescător de la 1, adăugând unu la fiecare pas (1, 2, 3, 4, 5 și așa mai departe):
Prompt
Creează o clasă MyNumbers care implementează __iter__() și __next__(). Iteratorul returnează numere începând cu 1, crescând cu unu de fiecare dată. Afișează primele 5 valori folosind next().
Ieșire: program Python complet

StopIteration

Nimic nu oprește iteratorul din exemplul anterior: cu suficiente apeluri next() sau într-o buclă for, nu s-ar termina niciodată.

Modul de a-l opri este excepția StopIteration.

Pune în __next__() o condiție care ridică această excepție după ce iterația a rulat de câte ori vrei:

Exemplu

Oprește iterația după 20 de valori:
Prompt
Creează o clasă MyNumbers cu __iter__() și __next__() care returnează numerele de la 1 la 20. Folosește StopIteration pentru a opri după 20 de iterații. Afișează toate valorile folosind o buclă for.
Ieșire: program Python complet