6.8 L'istruzione yield

yield_stmt  ::=  "yield" expression_list
Potete scaricare il file originale (in Inglese) come testo.

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.

Note: in Python 2.2, l'istruzione yield è permessa solo quando viene abilitata la caratteristica dei 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:

PEP 0255, Simple Generators
Le proposte per aggiungere generatori e l'istruzione yield a Python.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.