【じぇねれーた】

ジェネレータ(イテレータ) とは?

最終更新:
💡 次の値がほしいとき、続きから再開

処理を途中で止めて状態を保ち、次の値を求められたときに続きから再開するイテレータ。PythonやJavaScriptでは、yieldを使うジェネレータ関数から作れる。

📌 このページのポイント
ジェネレータ:nextで続きを進める例:1と2を順にyieldする関数を呼んでジェネレータを作る同じものにnextで値を求める1回目のnext① 1yieldで停止位置を保持2回目のnext② 2yieldで停止位置を保持3回目のnext終了done: trueJavaScript関数を呼び直すと、新しく作る次の値は、また最初から
JavaScriptの例。Pythonでは終了をStopIterationで知らせます。
ひよこ ひよこ
ジェネレータは、普通の関数とどう違うの?
ペンギン先生 ペンギン先生
PythonやJavaScriptのジェネレータ関数を呼ぶと、ジェネレータが作られる。作ったものへnextで次の値を求めると処理が進み、yieldで値を渡して一時停止する。同じものへの次のnextで、続きから再開するんだ。
ひよこ ひよこ
関数を何回も呼べば、続きの値になる?
ペンギン先生 ペンギン先生
関数を呼び直すと、新しいジェネレータを作るよ。例えば1と2をyieldする関数なら、同じジェネレータへのnextで1、次に2を取り出す。別に作ったジェネレータは、また最初から進むんだ。
ひよこ ひよこ
何が便利なの?
ペンギン先生 ペンギン先生
必要になった分だけ値を作れるので、最初から全部の値を一覧にする必要がないよ。大量の値や、終わりのない数列を扱うときにも役立つ。ただし、取り出した値を全部保存すれば、その分のメモリは必要なんだ。
ひよこ ひよこ
どうやって、終わったことが分かるの?
ペンギン先生 ペンギン先生
JavaScriptのnext()はvalueとdoneを持つ結果を返し、終了ならdoneがtrueになる。Pythonでは終わるとStopIterationが発生するよ。for文などは、この終了を扱いながら順番に値を取り出せるんだ。
ひよこ ひよこ
yieldがあれば、通信も非同期になる?
ペンギン先生 ペンギン先生
通常のジェネレータのyieldは、値を渡して処理を止める仕組みだよ。それだけで通信が非同期になったり、別のスレッドで動いたりするわけではない。非同期に次の値を受け取る仕組みは、非同期ジェネレータとして区別するんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ジェネレータ」って出てきたら「必要なときに続きから値を作るイテレータ」と思えばだいたいOK!
📖 おまけ:英語の意味
「Generator」 = 生成するもの
💬 値を順番に生成するものを表す名前だよ。ジェネレータ関数と、その関数から作るジェネレータを分けて考えると分かりやすいんだ。

参考資料

← 用語集にもどる