6.8 yield

Download entire grammar as text.

yield 文は、ジェネレータ関数 (generator function) を 定義するときだけ使われ、かつジェネレータ関数の本体の中でだけ 用いられます。 関数定義中で yield 文を使うだけで、関数定義は通常の関数 でなくジェネレータ関数になります。

ジェネレータ関数が呼び出されると、ジェネレータイテレータ (generator iterator)、一般的にはジェネレータ (generator) を 返します。ジェネレータ関数の本体は、ジェネレータの next() が例外を発行するまで繰り返し呼び出して実行します。

yield 文が実行されると、現在のジェネレータの状態は 凍結 (freeze) され、expression_list の値が next() の呼び出し側に返されます。ここでの ``凍結'' は、ローカルな変数への 束縛、命令ポインタ (instruction pointer)、および内部実行スタック (internal evaluation stack) を含む、全てのローカルな状態が保存される ことを意味します: すなわち、必要な情報を保存しておき、次に next() が呼び出された際に、関数が yield 文をあたかも もう一つの外部呼出しであるかのように処理できるようにします。

Python バージョン 2.5 では、yield 文が try ... finally 構造における try 節で許されるようになりました。ジェネレータが終了(finalized)される (参照カウントがゼロになるか、ガベージコレクションされる) までに再開されなければ、 ジェネレータ-イテレータの close() メソッドが呼ばれ、 留保されている finally 節が実行できるようになります。

注意: Python 2.2 では、generators 機能が有効になっている場合にのみ yield 文を使えます。Python 2.3 では、常に有効になっています。 __future__ import 文を使うと、この機能を有効にできます:

from __future__ import generators

参考:

PEP 0255, 単純なジェネレータ
Python へのジェネレータと yield 文の導入提案

PEP 0342, 改善されたジェネレータによるコルーチン (Coroutine)
その他のジェネレータの改善と共に、 yieldtry ... finally ブロックの中に存在することを 可能にするための提案

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。