Iterables

  • str, list, tuple i dict són tipus iterables. També ho és range.

  • El tipus file és un iterador, no un iterable. Efectivament, disposa del mètode next(), 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