【いてれーたー】
イテレーター とは?
最終更新:
💡 データの列を「一つずつ取り出す自動販売機」
データの列から次の要素を一つずつ取り出す仕組み。配列やリストなどの内部構造に依存せず走査するために使い、必要時に値を生成する列も扱える。設計パターンや言語の反復プロトコルとして登場する。
📌 このページのポイント
- 次の要素を取り出す操作で、データの列を順に走査する
- JavaScriptのfor...ofやPythonのforは反復の仕組みを使う
- 取り出せるデータと、走査中のイテレーターは区別する
- 必要時に値を生成する実装なら、一括生成を避ける遅延処理にも使える
イテレーターって普通の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は「繰り返す」という意味。要素を一つずつ繰り返し取り出すことからこう呼ばれるよ