yield_stmt |
::= | "yield" expression_list |
L'istruzione yield viene usata solo quando si definisce una funzione generatore e viene usata solo nel corpo della funzione generatore. L'uso dell'istruzione yield nella definizione di una funzione è sufficiente a creare una funzione generatore invece che una normale funzione.
Quando viene chiamata, una funzione generatore restituisce un iteratore conosciuto come un generatore iteratore, o più comunemente, un generatore. Il corpo della funzione generatore viene eseguito da una chiamata reiterata al metodo next() del generatore fino al sollevamento di un'eccezione.
Quando viene eseguita l'istruzione yield, lo stato del generatore viene congelato ed il valore dell'expression_list viene restituita alla chiamata next(). Per ``congelata'' si intende che tutto lo stato locale viene conservato, inclusi i legami correnti delle variabili locali, il puntatore all'istruzione e lo stack di valutazione interno: sono salvate sufficienti informazioni, cosicché la prossima volta che viene invocato next(), la funzione possa procedere esattamente come se l'istruzione yield fosse una chiamata dall'esterno.
L'istruzione yield non è permessa nella clausola try di un costrutto try ... finally. La difficoltà è che non c'è garanzia che il generatore verrà ripreso, quindi non c'è garanzia che il blocco finally sia eseguito.
generatori
. Sarà sempre
abilitata in Python 2.3. L'istruzione import __future__
può
essere usata per abilitare questa caratteristica:
from __future__ import generators
Vedete anche:
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.