yield_stmt | ::= | "yield" expression_list |
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 節が実行できるようになります。
generators
機能が有効になっている場合にのみ
yield 文を使えます。Python 2.3 では、常に有効になっています。
__future__
import 文を使うと、この機能を有効にできます:
from __future__ import generators
参考:
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。