#
6.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` 文をあたかも もう一つの外部呼出しであるかのように処理できるようにします。

`yield` 文は、`try` ... `finally` 構造の `try` 節中で使うことはできません。ジェネレータが常に 実行再開されるとは限らないので、`finally` ブロックが常に 実行される保証がないという問題があるためです。

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

    from __future__ import generators

参考資料:

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