ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
生成器。プログラミングにおいては、要素を生成して他の処理に受け渡す処理をいう。
プログラミング言語にもよるが、ジェネレーターは関数として定義され、値を返す時にreturnの代わりにyieldというキーワードを使うように実装されていることが多い。そしてyieldで値を返すとそこで一時停止し、次の値を要求された時に再び動き出す。
キーワードがyieldであるのは、かつてMITのバーバラ・リスコフらが開発しオブジェクト指向の発展に寄与することになったCLUというプログラミング言語が初出であり、この影響を受けているためである。ただしジェネレーターに対応するプログラミング言語が全てyieldでジェネレーターを実現しているわけではない。PythonやPHPのyieldはジェネレーターであるが、Rubyのyieldはジェネレーターではない。
例えば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は初期値と終了値を引数に与えられるように実装したため、呼び出し元の引数を変えることで得られる値を変えることができる。
yieldでは一旦停止するので、次のように書いても期待通りに動作する。
def gennum(): yield 1 yield 2 yield 3 yield 4 yield 5
for n in gennum(): print(n)
実際の実装においては、上記のようなリストでも充分達成できるような単純な使い方はあまりしないと思われる。
処理にもよるが、乱数を生成してみたり、素数を順番に生成してみたり、あるいはデータベースを読み取って特定の内容を順番に返したり、といったような処理に利用できる。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます