ジェネレーター (プログラミング)
読み:ジェネレーター
外語:generator

 生成器。プログラミングにおいては、要素を生成して他の処理に受け渡す処理をいう。
目次

概要
 プログラミング言語において、リストなどのシーケンスをイテレーションすることはよくある処理である。
 リストなどのシーケンスは、プログラムが記述された時点で固定的に要素が存在し、プログラム内に直接記述されている。しかしジェネレーターは、使い方はイテレーターと似ているが、ジェネレーター作成時点ではまだ要素が存在していない。ジェネレーターは日本語で生成器と呼ばれ、必要になったときに適宜要素は作られる。この特徴から、リストとは違ってインデックスで参照したりすることはできない。

特徴

yield
 プログラミング言語にもよるが、ジェネレーターは関数として定義され、値を返す時にreturnの代わりにyieldというキーワードを使うように実装されていることが多い。そしてyieldで値を返すとそこで一時停止し、次の値を要求された時に再び動き出す。
 キーワードがyieldであるのは、かつてMITのバーバラ・リスコフらが開発しオブジェクト指向の発展に寄与することになったCLUというプログラミング言語が初出であり、この影響を受けているためである。ただしジェネレーターに対応するプログラミング言語が全てyieldでジェネレーターを実現しているわけではない。PythonやPHPのyieldはジェネレーターであるが、Rubyのyieldはジェネレーターではない。

実装例1
 例えばPythonを例とし、1から10までの数を順番に生成する関数gennumと、それを使う処理は、次のように書ける。
def gennum(start, end):
  i = start
  while i < end:
    yield i
    i += 1
for n in gennum(1, 10):
  print(n)
 gennumは初期値と終了値を引数に与えられるように実装したため、呼び出し元の引数を変えることで得られる値を変えることができる。

実装例2
 yieldでは一旦停止するので、次のように書いても期待通りに動作する。
def gennum():
  yield 1
  yield 2
  yield 3
  yield 4
  yield 5
for n in gennum():
  print(n)

応用
 実際の実装においては、上記のようなリストでも充分達成できるような単純な使い方はあまりしないと思われる。
 処理にもよるが、乱数を生成してみたり、素数を順番に生成してみたり、あるいはデータベースを読み取って特定の内容を順番に返したり、といったような処理に利用できる。

再検索