#
8 `yield` 文

  yield_stmt | ::= | "yield" expression_list

  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)
  その他のジェネレータの改善と共に、 `yield` が `try` ... `finally` ブロックの中に存在することを 可能にするための提案