##
5 ジェネレータ式

ジェネレータ式 (generator expression) とは、丸括弧を使ったコンパクトな ジェネレータ表記法です:

  generator_expression | ::= | "(" test genexpr_for ")"
  genexpr_for | ::= | "for" expression_list "in" test [genexpr_iter]
  genexpr_iter | ::= | genexpr_for | genexpr_if
  genexpr_if | ::= | "if" test [genexpr_iter]

  Download entire grammar as text.

ジェネレータ式は新たなジェネレータオブジェクトを生み出します。 ジェネレータ式は単一の式の後ろに少なくとも一つの `for` 節と、場合によりさらに複数の`for` または `if` 節を 続けたものです。 新たなジェネレータが繰り返す値は、各`for` および `if` 節をブロックとして、左から右へとネストし、 その最内ブロックの中で式を評価した結果を出力しているものと みなせます。

ジェネレータ式の使う変数の評価は、ジェネレータオブジェクトに対して `next()` メソッドを呼び出すまで遅延されます。とはいえ、 もっとも左に位置する `for` 節はただちに評価されるため、 ジェネレータ式の最左 `for` 節のエラーは、ジェネレータ式を 使っているコードの他のエラーに先立って起きることがあります。 それ以後の `for` 節は、先行する `for` ループに 依存しているため、直ちには評価されません。

例: "`(x*y for x in range(10) for y in bar(x))`"

関数の唯一の引数として渡す場合には、丸括弧を省略できます。 詳しくは5.3.4 節を参照してください。