Iterables¶
str
,list
,tuple
idict
són tipus iterables. També ho ésrange
.El tipus
file
és un iterador, no un iterable. Efectivament, disposa del mètodenext()
, que va generant cada fila d’un fitxer i no permet «tirar enrere», cal tornar a obrir el fitxer.Per obtenir l’iterador associat a un iterable, cal utilitzar la funció
iter()
.Un iterador és també un iterable. Justament, si executem
iter(iterador)
obtindrem el propi iterador.Podem desar tots els elements d’un iterador en una llista (o una tupla …), però únicament si sabem que l’iterador genera un nombre petit d’elements.
Perill
No intenteu mai desar un iterador infinit en una llista (o similar), podeu bloquejar completament l’ordinador.
Exemples:
>>> l = [3, 45]
>>> it = iter(l) # Obtenim l'iterador associat a la llista
>>> next(it) # Recorrem l'iterador (no la llista)
3
>>> next(it)
45
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> type(it)
<class 'list_iterator'>
>>> iter(it) is it # Comprovació que it és un iterador
True
>>> it = iter('hola') # Obtenim l'iterador associat a l'string
>>> tuple(it) # Desem la seqüència en una tupla
('h', 'o', 'l', 'a')
>>> it = iter(range(4)) # Obtenim l'iterdor associat a un rang
>>> type(it)
<class 'range_iterator'>
>>> for x in it: # Doble bucle sobre un mateix iterador
... for y in it: # El `for` intern exhaureix l'iterador
... print(x, y)
...
0 1
0 2
0 3