【いてれーたー】

イテレーター とは?

最終更新:
💡 データの列を「一つずつ取り出す自動販売機」

データの列から次の要素を一つずつ取り出す仕組み。配列やリストなどの内部構造に依存せず走査するために使い、必要時に値を生成する列も扱える。設計パターンや言語の反復プロトコルとして登場する。

📌 このページのポイント
次の要素を一つずつ取り出す 配列の例:A・B・C A B C 走査の状態を持つ イテレーター:next() JavaScriptで呼んだ結果の例 A done:false B done:false C done:false 終端 done:true Cを返した後、次の呼出しで終端 終端の表し方は言語によって違う
JavaScriptの配列イテレーターを最初から進める例。A/B/Cのvalueとdone:false、最後にdone:true。一括生成した配列のメモリがなくなるわけではない。
ひよこ ひよこ
イテレーターって普通のfor文と何が違うの?
ペンギン先生 ペンギン先生
番号で配列にアクセスする代わりに、次のデータを求める仕組みだよ。JavaScriptの配列・Set・Mapや、Pythonのファイルの行などを、反復の窓口で扱える。終わりの表し方は言語ごとに違い、JavaScriptならnext()の結果のdone、PythonならStopIterationだね。
ひよこ ひよこ
具体的にどう使うの?
ペンギン先生 ペンギン先生
JavaScriptのfor (const item of items)やPythonのfor item in items:で、反復できるデータからイテレーターを得て使うよ。データの集まりと走査の状態は別で、Pythonのリストは新しく走査し直せるけれど、使い切った同じイテレーターは先頭に戻らないんだ。
ひよこ ひよこ
イテレーターなら必ずメモリが少なくて済む?
ペンギン先生 ペンギン先生
元の配列を全部用意していれば、その配列のメモリは残るよ。PythonのyieldやJavaScriptのfunction*などで値を必要時に生成するなら、一括で作るのを避けられる。ただし処理途中の保存や実装次第なので、イテレーターというだけで省メモリが保証されるわけではないね。
ひよこ ひよこ
無限イテレーターって何に使うの?
ペンギン先生 ペンギン先生
Pythonのitertools.count()は、既定では0, 1, 2...と整数を順に返すよ。番号付けや、必要な件数だけ取り出す処理に使える。最後まで列挙しようとすると終わらないので、件数や条件で打ち切る。無限の列を作れることと、処理が自動で適切に止まることは別なんだ。
ひよこ ひよこ
async iteratorってあるの?
ペンギン先生 ペンギン先生
あるよ。JavaScriptのfor await...ofは次の値を待ちながら反復できる。APIのページを順に取得する処理なら、それを非同期イテレーターとして実装すると扱いやすい。APIやWebSocketが自動でその形式になるわけではなく、対応する仕組みや変換が必要だよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「イテレーター」って出てきたら「データの集まりから要素を一つずつ順番に取り出す仕組みだな」と思えればだいたいOK!
📖 おまけ:英語の意味
「iterator」 = 反復するもの
💬 iterateは「繰り返す」という意味。要素を一つずつ繰り返し取り出すことからこう呼ばれるよ

参考資料

← 用語集にもどる