La parola chiave yield in Python
Questo tutorial spiegherà lo scopo e l’uso della parola chiave yield
in Python. La parola chiave yield
è un’istruzione Python usata per definire le funzioni del generatore in Python. L’istruzione yield
può essere utilizzata solo all’interno del corpo della funzione.
La principale differenza tra una funzione generatore e una funzione regolare è che la funzione generatore contiene un’espressione yield
invece dell’istruzione return
. L’istruzione yield
produce come output la serie di valori chiamata iteratore generatore. Nuovi valori dall’iteratore possono essere recuperati usando la funzione next()
o il cicli for
.
Ogni volta che viene chiamata la funzione next()
o ad ogni iterazione del cicli for
, l’istruzione yield
restituisce o produce un nuovo valore e salva lo stato di esecuzione della posizione della funzione cioè i valori delle variabili locali, ecc. Ad ogni nuova chiamata o iterazione di funzione next()
, l’istruzione yield
riprende dall’ultimo stato salvato, a differenza dell’istruzione return
che inizia ad ogni chiamata.
Codici di esempio della parola chiave yield
in Python
Poiché il funzionamento dell’istruzione yield
è chiaro, esaminiamo ora i suoi usi e codici di esempio. Supponiamo di avere una grande quantità di dati e che non possa essere caricata contemporaneamente in un oggetto iterabile, o di voler leggere i dati in modo più efficiente in termini di memoria. Possiamo creare una funzione generatore utilizzando l’istruzione yield; la funzione leggerà e produrrà il nuovo blocco di dati ad ogni iterazione o chiamata di funzione next()
.
Il codice di esempio sotto mostra come usare l’istruzione yield
con il cicli for
per creare una semplice funzione di generatore in Python. La funzione del generatore my_generator()
nel codice di esempio sotto restituirà il nuovo numero da 1
a 100
e funzionerà fino a 99
chiamate.
def my_generator():
for x in range(1, 100):
print("new value is generated!")
yield x
Avremo prima bisogno di un oggetto iteratore generatore per generare valori utilizzando la funzione next()
o tramite iterazione.
gen_iter = my_generator()
Ora prendiamo i nuovi valori dall’iteratore del generatore usando la funzione next()
; possiamo anche usare la funzione next()
come iterator.__next__()
, come mostrato nel codice di esempio sotto.
val = next(gen_iter)
print("Value =", val)
val = gen_iter.__next__()
print("Value =", val)
Produzione:
new value is generated!
Value = 1
new value is generated!
Value = 2
L’altro metodo per ottenere nuovi valori è iterare attraverso l’oggetto iteratore del generatore usando il cicli for
; il codice di esempio seguente mostra come iterare attraverso l’oggetto iteratore del generatore in Python.
for val in gen_iter:
print("Value =", val)
L’esempio di codice sopra genererà tutti i valori 99
dall’intervallo specificato nella funzione del generatore.
Possiamo anche creare una funzione generatore senza il cicli for
utilizzando più volte l’istruzione yield
, come mostrato nel codice di esempio sotto.
def my_generator():
x = 1
print("new value is generated!")
yield x
x = x + 1
print("new value is generated!")
yield x
x = x + 1
print("new value is generated!")
yield x
Ora, usiamo la nostra nuova funzione di generatore per generare tutti i valori usando il cicli for
.
gen_iter = my_generator()
for val in gen_iter:
print("Value =", val)
Produzione:
new value is generated!
Value = 1
new value is generated!
Value = 2
new value is generated!
Value = 3