Iteratore Python

Iteratore Python

L'iteratore è un oggetto che contiene un numero contabile di valori.

L'iteratore è un oggetto iterabile, il che significa che puoi esplorare tutti i valori.

Technicamente, in Python, l'iteratore è un oggetto che implementa il protocollo dell'iteratore, che contiene i metodi __iter__() e __next__().

Iteratore VS Oggetto Iterabile (Iterable)

Elenco, tuple, dizionario e set sono oggetti iterabili. Sono contenitori iterabili dai quali è possibile ottenere un iteratore (Iterator).

Tutti questi oggetti hanno un metodo per ottenere l'iteratore iter() Metodo:

Esempio

Restituire un iteratore dal tuple e stampare ogni valore:

mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))

Eseguire l'esempio

Anche le stringhe sono oggetti iterabili e possono restituire un iteratore:

Esempio

Anche le stringhe sono oggetti iterabili, che contengono una serie di caratteri:

mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))

Eseguire l'esempio

Esplorazione dell'iteratore

Possiamo anche utilizzare un ciclo for per esplorare gli oggetti iterabili:

Esempio

Iterare sui valori del tuple:

mytuple = ("apple", "banana", "cherry")
for x in mytuple:
  print(x)

Eseguire l'esempio

Esempio

Iterare sui caratteri della stringa:

mystr = "banana"
for x in mystr:
  print(x)

Eseguire l'esempio

Suggerimento:Il ciclo for crea effettivamente un oggetto iteratore e esegue per ogni esecuzione del ciclo next() metodo.

creazione dell'iteratore

Per creare un oggetto/cla come iteratore, è necessario implementare per l'oggetto __iter__() e __next__() metodo.

Come hai imparato nel capitolo delle classi/oggetti in Python, tutte le classi hanno un metodo chiamato __init__() La funzione, che consente di eseguire alcune inizializzazioni durante la creazione dell'oggetto.

__iter__() Il metodo ha una funzione simile, puoi eseguire operazioni (inizializzazione ecc.) ma devi sempre restituire l'oggetto iteratore stesso.

__next__() Il metodo consente anche di eseguire operazioni e deve restituire l'elemento successivo della sequenza.

Esempio

Creare un iteratore che restituisce numeri, iniziando da 1, con ogni sequenza che aumenta di 1 (restituisce 1, 2, 3, 4, 5 ecc...):

class MyNumbers:
  def __iter__(self):
    self.a = 1
    restituire self
  def __next__(self):
    x = self.a
    self.a += 1
    restituire x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

Eseguire l'esempio

StopIteration

Se hai abbastanza next() istruzione, o nell'uso del ciclo for, l'esempio sopra continuerà per sempre.

Per prevenire che l'iterazione continui per sempre, possiamo utilizzare StopIteration istruzione.

in __next__() In un metodo, se l'iterazione è completata un numero specificato di volte, possiamo aggiungere una condizione di terminazione per sollevare un errore:

Esempio

Fermare dopo 20 iterazioni:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    restituire self
  def __next__(self):
    se self.a <= 20:
      x = self.a
      self.a += 1
      restituire x
    else:
      sollevare StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
per x in myiter:
  print(x)

Eseguire l'esempio