Iteratori Python
Iteratori Python
Un iteratore è un oggetto che contiene un numero numerabile di valori.
Un iteratore è un oggetto su cui è possibile iterare, il che significa che puoi attraversare tutti i valori.
Tecnicamente, in Python, un iteratore è un oggetto che implementa il protocollo iteratore, che consiste nei metodi __iter__()
e __next__()
.
Iteratore vs Iterabile
Elenchi, tuple, dizionari e insiemi sono tutti oggetti iterabili. Sono contenitori iterabili da cui puoi ottenere un iteratore.
Tutti questi oggetti hanno un iter()
metodo che viene utilizzato per ottenere un iteratore:
Esempio
Restituisce un iteratore da una tupla e stampa ogni valore:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
Anche le stringhe sono oggetti iterabili e possono restituire un iteratore:
Esempio
Le stringhe sono anche oggetti iterabili, contenenti una sequenza 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))
Ciclo attraverso un iteratore
Possiamo anche usare un for
ciclo per scorrere un oggetto iterabile:
Esempio
Iterare i valori di una tupla:
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
Esempio
Itera i caratteri di una stringa:
mystr = "banana"
for x in mystr:
print(x)
Il for
ciclo crea effettivamente un oggetto iteratore ed esegue il metodo next() per ogni ciclo.
Crea un iteratore
Per creare un oggetto/classe come iteratore devi implementare i metodi
__iter__()
e
__next__()
il tuo oggetto.
Come hai appreso nel capitolo Classi/Oggetti Python , tutte le classi hanno una funzione chiamata
__init__()
, che ti consente di eseguire alcune inizializzazioni durante la creazione dell'oggetto.
Il __iter__()
metodo agisce in modo simile, puoi eseguire operazioni (inizializzazione ecc.), Ma deve sempre restituire l'oggetto iteratore stesso.
Il __next__()
metodo consente anche di eseguire operazioni e deve restituire l'elemento successivo nella sequenza.
Esempio
Crea un iteratore che restituisca numeri, a partire da 1, e ogni sequenza aumenterà di uno (restituendo 1,2,3,4,5 ecc.):
class MyNumbers:
def __iter__(self):
self.a =
1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
Interrompi l'iterazione
L'esempio sopra continuerebbe per sempre se avessi abbastanza istruzioni next() o se fosse usato in un
for
ciclo.
Per evitare che l'iterazione continui per sempre, possiamo usare l'
StopIteration
istruzione.
Nel __next__()
metodo, possiamo aggiungere una condizione di terminazione per generare un errore se l'iterazione viene eseguita un numero specificato di volte:
Esempio
Interrompi dopo 20 iterazioni:
class MyNumbers:
def __iter__(self):
self.a =
1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass =
MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)