Definició: En Python, un iterador és un objecte que permet recórrer una seqüència d’elements d’un en un. Cada vegada que s’aplica la funció next()
, l’iterador retorna el següent element. Quan no en queden més, llença l’excepció StopIteration
.
Iterador vs. Iterable
- Iterable: objecte que pot proporcionar un iterador amb
iter()
(per exemple,list
,tuple
,set
,dict
). - Iterador: objecte retornat per
iter()
i consumit pernext()
.
fruits = ["poma", "plàtan", "cirera"]
# obtenim un iterador
it = iter(fruits)
print(next(it)) # poma
print(next(it)) # plàtan
print(next(it)) # cirera
print(next(it)) # StopIteration (quan s'acaben els elements)
Característiques principals
- Els iteradors recorden la posició actual dins de la seqüència.
- Només es poden recórrer una vegada; un cop consumits, cal crear-ne un de nou.
- Són ideals per treballar amb grans conjunts de dades o fluxos infinits (gràcies a la generació sota demanda).
Com crear un iterador propi
Pots crear una classe que implementi els mètodes especials __iter__()
i __next__()
:
class Comptador:
def __init__(self, limit):
self.limit = limit
self.count = 0
def __iter__(self):
return self
def __next__(self):
if self.count < self.limit:
self.count += 1
return self.count
else:
raise StopIteration
for num in Comptador(3):
print(num)
# 1, 2, 3
Relació amb generadors
Els generadors són una manera senzilla de crear iteradors utilitzant la paraula clau yield
:
def comptar(limit):
for i in range(1, limit + 1):
yield i
for n in comptar(3):
print(n)
Errors comuns i bones pràctiques
- Consum accidental: un iterador no es pot “reiniciar”; crea’n un de nou amb
iter()
si cal tornar a començar. - Excepció StopIteration: indica que s’han acabat els elements, no és un error real.
- Iteració segura: els bucles
for
gestionen automàticamentStopIteration
.
Vegeu també
- Iterable (Python): objecte capaç de proporcionar un iterador amb
iter()
. - Generador (Python): funció que crea iteradors de forma més simple amb
yield
. - Conjunt (
set
): estructura iterable que pot convertir-se en iterador.