
Creare una classe iteratore in Python
Creare una classe che genera oggetti iteratori ti permette di definire sequenze personalizzate.
L’idea alla base della classe iteratore è di definire il comportamento di un oggetto che mantiene lo stato durante l'iterazione e implementi i metodi `__iter__()` e `__next__()`.
Ti faccio un esempio pratico.
Immagina di voler creare un iteratore che generi numeri pari fino a un valore massimo.
class EvenNumbersIterator:
def __init__(self, max_value):
self.max_value = max_value # Definisce il valore massimo dei numeri pari da generare
self.current = 0 # Inizializza il contatore al primo numero pari
def __iter__(self):
return self # Restituisce l'oggetto iteratore stesso
def __next__(self):
if self.current > self.max_value:
raise StopIteration # Termina l'iterazione quando si supera il valore massimo
else:
even_number = self.current
self.current += 2 # Incrementa per ottenere il prossimo numero pari
return even_number # Restituisce il numero pari corrente
Il metodo `__next__()` deve sempre prevedere la condizione di terminazione, in cui solleva l'eccezione `StopIteration`.
Questo meccanismo è essenziale per evitare cicli infiniti e per indicare al ciclo `for` che l'iterazione è completata.
Dopo aver definito la classe, puoi creare un'istanza dell'iteratore.
even_numbers = EvenNumbersIterator(10)
Poiché 'even_numbers' è un oggetto iteratore, puoi estrarre i singoli valori in sequenza anche usando la funzione `next()`.
next(even_numbers)
2
next(even_numbers)
4
Ogni volta che esegui la funzione 'next()' viene estratto il valore successivo della sequenza.
In alternativa, puoi anche utilizzare l'oggetto che hai appena creato in un ciclo `for`
for number in even_numbers:
print(number)
L'output sarà:
0
2
4
6
8
10
Puoi estendere la funzionalità dell'iteratore per includere altre caratteristiche, come l'iterazione in ordine inverso, saltare determinati numeri, o iterare su elementi di una sequenza con una logica specifica.