6.8 Instrukcja yield

 

yield_stmt  ::=  "yield" expression_list
Pobierz całą gramatykę w postaci tekstowej.

 

Instrukcja yield jest używana wyłącznie przy definiowaniu funkcji generującej i występuje wówczas w jej treści. Użycie wewnątrz definicji funkcji instrukcji yield jest warunkiem wystarczającym, aby stała się ona funkcją generującą, zamiast zwykłej funkcji.

Wywołanie funkcji generującej zwraca tak zwany iterator generujący, lub po prostu generator. Wykonywanie treści funkcji generującej następuje każdorazowo po wywołaniu metody next() generatora, aż do czasu, gdy funkcja wygeneruje wyjątek.

Przy wykonywaniu instrukcji yield następuje zamrożenie stanu generatora, a wartość wyrażenia podanego po słowie yield jest przekazywana do punktu wywołania metody next(). "Zamrożenie" oznacza w tym przypadku zapamiętanie całego stanu lokalnego, wraz z istniejącymi lokalnymi dowiązaniami nazw, wskaźnikiem instrukcji oraz wewnętrznym stosem wartościowania: zachowywana jest wystarczająca ilość informacji, aby przy kolejnym wywołaniu metody next() wykonywanie funkcji mogło być kontynuowane tak, jakby instrukcja yield była zwykłym wywołaniem funkcji.

Użycie instrukcji yield nie jest dozwolone w klauzuli try konstrukcji try ... finally. Ograniczenie wynika z tego, że nie ma żadnych gwarancji przyszłego wznowienia generatora, więc nie ma też gwarancji, że byłby kiedykolwiek wykonany zestaw klauzuli finally.

Notka: W wersji 2.2 Pythona użycie instrukcji yield jest możliwe tylko, jeśli aktywna jest własność o nazwie generators. W Pythonie 2.3 i w kolejnych wersjach cecha ta jest zawsze aktywna. Używana w tym przypadku instrukcja __future__ ma postać:

from __future__ import generators

Zobacz też:

PEP 0255, Proste generatory
Propozycja dodania do Pythona generatorów i instrukcji yield.

Zajrzyj do Informacji na temat tej publikacji... aby pomóc w jej rozwoju.