lettura facile

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.




Se qualcosa non ti è chiaro, scrivi la tua domanda nei commenti.




FacebookTwitterLinkedinLinkedin