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