当サイトは、アフィリエイト広告を利用しています

【Python】イテレータとは何か?|遅延評価と反復モデルの本質

作成日:2026月02月27日
更新日:2026年02月27日

Pythonの反復処理は、一見すると for 文だけで完結しているように見える。

for文
for x in data:
print(x)

しかし内部では、明確な構造の上に成り立っている

  • Iterable(イテラブル)
  • Iterator(イテレータ)
  • Generator(ジェネレータ)

これらは別物であり、役割も異なる。

本記事では特に イテレータ に焦点を当て、

  • イテレータとは何か
  • 遅延評価との関係
  • データ × 処理モデル
  • なぜPythonはイテレータ中心設計なのか

を整理する。

なお、上記の違いについては

で解説している

for文の正体

まず前提として、for 文は内部的に次のように動作している。

for文の詳細
it = iter(obj)
while True:
try:
value = next(it)
except StopIteration:
break

つまり反復の本質は

  1. iter() でイテレータを取得
  2. next() で1要素ずつ取り出す
  3. StopIteration で終了

である。

Pythonではfor 文はあくまで糖衣構文にすぎない。

イテレータとは何か?

イテレータとは、

  • next() によって次の値を返す仕組み

である。

重要なのは、

  • イテレータは「評価戦略」ではなく「取得インターフェース」である

という点である。

イテレータは遅延評価なのか?

Pythonのいろんな記事を読んでいると
イテレータと遅延評価はセットと思われがちだが

結論から言うと、

  • イテレータそのものは遅延評価ではない。

イテレータは単に「順に値を返す」だけの仕組みであり、

  • 値が事前計算済みか(即時評価)
  • next() 時に計算されるか(遅延評価)

は実装次第である。

例1:遅延ではないイテレータ

イテレータ
data = [1, 2, 3]
it = iter(data)
  • リストは既に全要素生成済み
  • next(it) は既存の値を返すだけ

これは遅延評価ではない。
リストを作成した時点で全要素がメモリに展開されており
イテレータは値を取り出しているだけ

例2:遅延的なイテレータ(ジェネレータ)

ジェネレータ
gen = (x * 2 for x in [1, 2, 3])
  • ジェネレータ式
  • この時点ではまだ計算されていない。
  • 計算方法(実行ロジック)」が保存されているだけ
next
next(gen)

が呼ばれた瞬間に初めて評価される。

これは遅延評価である。

遅延かどうかは「データ × 処理」で決まる

つまり、遅延評価はイテレータという言葉では決まらない。

評価タイミングは、

  • 元データがいつ生成されるか
  • 処理がいつ実行されるか

の組み合わせで決まる。

実装サンプルを使って動作を解説する

ケース1:即時データ × 即時処理

リスト内包表記
result = [x * 2 for x in [1, 2, 3]]
  • データ:即時
  • 処理:即時
  • → 完全即時評価

ケース2:即時データ × 遅延処理

ジェネレータ式
gen = (x * 2 for x in [1, 2, 3])
next(gen)
  • データ:即時
  • 処理:遅延
  • → 部分遅延

リストは既に全要素生成済みであるが
計算方法(実行ロジック)は遅延されている

next()が実行されて初めて評価される

ケース3:逐次データ × 遅延処理

py
gen = (x * 2 for x in range(10**9))
next(get)
  • rangeは巨大リストを生成しない
  • ジェネレータ式も next() 時に評価

→ データ取得と評価がともに逐次実行

より完全な遅延構造になる。

ジェネレータが重要な理由

ジェネレータは、

  • 状態を保持する
  • next() で再開する
  • yield で停止する

という実行モデルを持つ。

このモデルが、

  • 「必要になった瞬間だけ進む」

という逐次実行を可能にしている。

遅延評価を実現する最も自然な仕組みがジェネレータである。

ジェネレータについては下記記事で詳しく解説している

なぜPythonはイテレータ中心設計なのか?

Pythonは

  • データ構造
  • 取り出しの仕組み
  • 評価タイミング

を分離している。

この分離により、

  • メモリ効率を制御できる
  • 大規模データを扱える
  • 処理パイプラインを構築できる
  • ストリーム処理が可能になる

つまり、

  • Pythonの反復処理は「評価タイミングを設計できる構造」

なのである。

まとめ

イテレータとは

  • 順に値を返す仕組み(インターフェース)

である。

遅延評価そのものではない。

遅延かどうかは、

  • データ × 処理

の組み合わせで決まる。

関連記事

新着記事

タグ一覧
top