I generatori in Python
Nel linguaggio python un generatore è una funzione che restituisce un iteratore.
def generatore():
yield x
Al posto di return i generatori usano il comando yield.
Il generatore ritorna un elemento alla volta di un iteratore se richiamato con la funzione next.
Qual è la differenza tra una funzione e un generatore? La funzione restituisce l'intera sequenza in una sola volta mentre il generatore soltanto un elemento alla volta. Quindi, i generatori sono più indicati per elaborare liste molto grandi o insiemi con infiniti valori.
Come funziona un generatore
Il generatore conserva in memoria le variabili locali anche dopo aver terminato l'esecuzione.
Pertanto, se il generatore viene chiamato più volte, fornisce gli elementi in sequenza uno dopo l'altro.
Attenzione. Quando il generatore esaurisce gli elementi dell'iteratore, se lo richiamo ulteriormente mostra un errore StopIteration. E' quindi opportuno aggiungere un'eccezione. Questo errore può essere invocato appositamente tramite l'istruzione raise stopiteration per forzare l'uscita dal generatore.
Il funzionamento dei generatori è simile agli iteratori.
Qual è la differenza tra iteratore e generatore? Gli iteratori sono oggetti o classi mentre i generatori sono funzioni. Il risultato finale è lo stesso.
Un esempio pratico
Creo una funzione generatore composto da un iteratore con tre elementi ( A, B, C ).
def generatore():
yield "A"
yield "B"
yield "C"
Poi assegno il generatore all'oggetto prova.
prova=generatore()
Ora richiamo per la prima volta il generatore.
print(next(prova))
Ottengo in output il primo elemento dell'iteratore
A
Poi richiamo di nuovo il generatore con next.
print(next(prova))
Il generatore si ricorda l'ultimo elemento già consegnato (A) e restituisce il successivo (B).
In output ottengo il secondo elemento dell'iteratore
B
Infine richiamo nuovamente il generatore sempre con next.
print(next(prova))
Il generatore restituisce in output il terzo elemento.
C
E così via.