Gli iteratori in Python

Cos'è un iteratore

Un iteratore è un oggetto con le caratteristiche di un generatore. Restituisce gli elementi di un oggetto iterabile uno alla volta.

Qual è la differenza tra generatore e iteratore? Entrambi forniscono in output un iteratore. Tuttavia, il generatore è una funzione mentre l'iteratore è un oggetto o classe.

L'iteratore può essere una classe o un oggetto iterabile ( lista, dizionario, tupla, ecc. ).

Come fare una classe iteratore

Una classe iteratore è sempre caratterizzata da due metodi:

  • __iter__ definisce le caratteristiche dell'iteratore.
  • __next__ definisce la risposta dell'iteratore quando viene richiamato con il metodo next.

Esempio

Costruisco una semplice classe come iteratore.

La classe restituisce un numero naturale progressivo a partire da 1.

  1. class generatore:
  2. def __iter__(self):
  3. self.x = 1
  4. return self
  5. def __next__(self):
  6. y = self.x
  7. self.x += 1
  8. return y

Poi assegno l'oggetto a una variabile e la definisco come iteratore tramite la funzione iter().

  1. prova2=generatore2()
  2. iteratore = iter(prova2)

Ora chiamo tre volte l'oggetto iteratore tramite la funzione next().

  1. print(next(iteratore))
  2. print(next(iteratore))
  3. print(next(iteratore))

Il risultato in output è il seguente:

1
2
3

Ogni volta che chiamo l'iteratore, la classe ritorna il numero progressivo.

Si ricorda l'ultimo output e fornisce quello successivo. All'infinito...

Nota. In pratica, le variabili locali della classe non sono azzerate quando l'iteratore restituisce il risultato. E' come se l'oggetto fosse messo in sospensione, in attesa di una nuova chiamata.

Come trasformare una lista in iteratore

Nel linguaggio python qualsiasi oggetto iterabile ( liste, dizionari, tuple, ecc. ) può essere gestito come una iteratore.

Per trasformarlo in un iteratore uso la funzione iter()

lista2=iter(lista)

Una volta convertito in iteratore, può essere letto con la funzione next().

Esempio

Ho una lista contenente tre elementi.

lista=["A","B","C"]

In questa forma non potrei usarla come iteratore.

Devo trasformarla in un iteratore tramite la funzione iter()

lista2=iter(lista)

A questo punto posso lanciare un'istanza usando la funzione next()

print(next(lista2))

L'interprete mi restituisce in output il primo elemento

A

Eseguo la stessa istanza un'altra volta.

print(next(lista2))

L'interprete restituisce in output il secondo elemento

B

In pratica, l'iteratore mi fornisce gli elementi della lista uno alla volta, ricordandosi dell'ultimo.

E così via.

Attenzione. Se il numero degli elementi dell'iterabile è un numero finito N, dopo aver chiamato l'ultimo elemento N qualsiasi altra istanza N+1 visualizzerebbe l'errore StopIteration. E' opportuno associargli un'eccezione.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base
  1. Il linguaggio Python
  2. Come installare Python sul PC
  3. Come scrivere un programma in Python
  4. Come usare Python in modalità interattiva
  5. Le variabili
  6. I numeri
  7. Gli operatori logici
  8. Le strutture iterative ( o cicli )
  9. Le strutture condizionali
  10. Le eccezioni
  11. I file in python
  12. Le classi
  13. I moduli