Utilizzando yield
trasforma una funzione in una generator. Un generatore è un tipo specializzato di iterator. for
scorre sempre su iterables, prendendo ogni elemento a turno e assegnandolo al nome (i) che hai elencato.
spinning_cursor()
restituisce un generatore, il codice all'interno di spinning_cursor()
non viene effettivamente eseguito finché non si avvia il iterazione sul generatore. L'iterazione su un generatore significa che il codice nella funzione viene eseguito fino a quando non incontra un'istruzione yield
, a quel punto il risultato dell'espressione viene restituito come valore successivo e l'esecuzione viene nuovamente messa in pausa.
Il ciclo for
si limita a questo, chiameremo l'equivalente di next()
sul generatore, fino a quando il generatore segnali è fatto alzando StopIteration
(che avviene quando la funzione restituisce). Ogni valore restituito di next()
viene assegnato, a sua volta, a c
.
si può vedere questo creando il generatore nel prompt di Python:
>>> def spinning_cursor():
... cursor='/-\|'
... i = 0
... while 1:
... yield cursor[i]
... i = (i + 1) % len(cursor)
...
>>> sc = spinning_cursor()
>>> sc
<generator object spinning_cursor at 0x107a55eb0>
>>> next(sc)
'/'
>>> next(sc)
'-'
>>> next(sc)
'\\'
>>> next(sc)
'|'
Questo generatore specifico restituisce mai, così StopIteration
non è mai sollevato e il ciclo for
andrà avanti per sempre a meno che non si uccide lo script.
fonte
2013-05-10 13:42:18
Un altro esempio? per i in range (10): print (i) – antoyo
potresti trovare tutto qui: http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained – pylover
Un altro esempio di come la resa stava funzionando con una funzione qui ... Non ho bisogno di un esempio ora che ho capito. Inoltre, grazie @pylover – Paul