0コメント

【演習解説付き】東大Python入門「イテラブルとイテレータ」を網羅。for文の仕組みを徹底理解

【Python初心者必見】イテラブルとイテレータの違いを徹底解説!for文の裏側まで丸わかり | Python学習ノート

🐍 東大の教材で学ぶPython基礎:4-2. イテラブルとイテレータの完全ガイド

Pythonでfor文を使いこなすために避けて通れないのが「イテラブル(Iterable)」「イテレータ(Iterator)」の概念です。この2つの違いを理解すると、メモリ効率の良いプログラムが書けるようになります!

💡 この記事の結論
  • イテラブル:繰り返しの「素材」(リスト、文字列など)
  • イテレータ:繰り返しの「作業員」(一度使うと中身がなくなる)

📖 この記事で登場する重要用語

● イテラブル (Iterable) リストや文字列など、「中身を順に取り出すことができる」オブジェクトのこと。繰り返しの「素材」です。
● イテレータ (Iterator) 実際に値を一つずつ取り出す「仕掛け」のこと。一度使うと中身が空になる「使い切り」の性質を持ちます。
● StopIteration イテレータが最後の要素を出し切ったときに発生する合図(例外)。これによって for 文は終了タイミングを判断します。
● ファイルオブジェクト Pythonでファイルを開いたときに作成されるもの。実はこれ自体が「イテレータ」であるため、一度読み切ると再利用できないという特徴があります。

※ これらの用語の関係性を理解することで、Pythonの繰り返し処理の裏側がスッキリ見えてきます。

1. ファイルオブジェクトに見る「使い切り」の性質

Pythonでファイルを読み込むとき、for文の後にファイルオブジェクトを置くことができます。しかし、ここには大きな特徴があります。

with open('sample.txt', 'r') as f: print('---- 1回目 ----') for line in f: print(line) print('---- 2回目 ----') for line in f: print(line)           # ここは実行されない! 
⚠️ 注意:ファイルは一度読むと「消費」される
ファイルオブジェクトはイテレータです。一度最後まで読み取ると「現在の位置」が終端に達するため、同じオブジェクトを二度読み直すことはできません。

2. イテラブルとイテレータの決定的な違い

🔄 イテラブル(Iterable)

iter()関数を適用できるオブジェクトです。何度も繰り返し使えます。

  • 例:リスト [1, 2, 3], 文字列 "Hello", range(5)
  • 特徴:for文に入れるたびに、新しい作業員(イテレータ)を作って中身を取り出します。

⚙️ イテレータ(Iterator)

next()関数を適用できるオブジェクトです。状態を保持する「使い捨て」の道具です。

  • 例:enumerate()の結果、ファイルオブジェクト
  • 特徴:next()を呼ぶたびに次の要素を返し、最後まで行くと StopIteration を発生させます。
比較項目 イテラブル (素材) イテレータ (作業員)
next() の使用 ❌ できない ✅ できる
再利用 ✅ 何度でも可能 ❌ 一度きり(消費される)
主な種類 List, String, Range File, Enumerate, Zip

3. 🛠 具体的な使用状況:いつ意識するの?

① 大容量データの処理(メモリ節約)

1GBのテキストファイルを処理する場合、リスト(イテラブル)に全行読み込むとメモリがパンクします。しかし、ファイルオブジェクト(イテレータ)として1行ずつ処理すれば、メモリ消費を最小限に抑えられます。

② インデックス付きループ(enumerate)

enumerateはイテレータを返します。これを利用することで、「今何行目か」をスマートに管理できます。

with open('log.txt', 'r') as f: for i, line in enumerate(f): if "ERROR" in line: print(f"{i}行目でエラー発見!") 

4. 📝 まとめ:重要ポイント

  • イテラブルiter()イテレータ に変換される。
  • for文 は、内部で next() を呼び出し、StopIteration が出るまで繰り返す仕組み。
  • イテレータ を二度回したいときは、再度生成する必要がある。
  • ファイルオブジェクト はイテレータなので「一度読んだら終わり」と覚える。

🏁 おわりに:ステップアップのための周辺知識

お疲れ様でした!イテラブルとイテレータの基本をマスターしたあなたへ、さらに深いPythonの世界を覗くためのヒントをいくつかご紹介します。

  • ✨ ジェネレータ (Generator)
    イテレータをより簡単に作るための仕組みです。yieldキーワードを使うことで、膨大なデータを一度にメモリに乗せず、必要な分だけその都度生成する「遅延評価」が可能になります。
  • 📦 itertools モジュール
    Pythonの標準ライブラリには、イテレータを効率的に操作するためのツール群(無限ループや組み合わせ生成など)が用意されています。複雑なループ処理を驚くほどシンプルに書けるようになります。
  • 🧠 メモリ効率と実行速度
    「リスト(イテラブル)」は全ての値をメモリに保持しますが、「イテレータ」は次の値の生成方法だけを知っています。数百万件のデータを扱うプロの現場では、この違いがプログラムの動作速度や安定性に直結します。

🚀 次のステップ:

次は「ジェネレータ関数」について調べてみると、今回学んだイテレータの真の強力さが実感できるはずです。Pythonらしい、エレガントなコードを目指しましょう!

📚 用語詳細リファレンス(網羅版)

本セクションでは、学習に登場した概念を一つずつ深掘りして解説します。

✅ イテラブル (Iterable)
for文の in の直後に置くことができるオブジェクトです。内部に __iter__ メソッドを持っており、呼び出すと新しいイテレータを生成します。リスト、タプル、文字列、辞書、rangeオブジェクトなどがこれに該当します。
✅ イテレータ (Iterator)
「現在の進行状況」を保持しながら、要素を一つずつ取り出すためのオブジェクトです。内部に __next__ メソッドを持っています。イテレータは「使い捨て」であり、一度最後まで進むと巻き戻すことはできません。
✅ iter() 関数
イテラブル(素材)からイテレータ(作業員)を作成するための組み込み関数です。
例:it = iter([1, 2, 3]) とすることで、リストを操作するイテレータが得られます。
✅ next() 関数
イテレータから「次の要素」を一つ取り出す関数です。呼ぶたびにイテレータの内部状態が一行(あるいは一要素)進みます。
✅ StopIteration
イテレータに「次の要素」がなくなったときに発生する例外です。Pythonの for 文は、この例外を検知することで、エラーとして停止させるのではなく「ループの正常終了」として処理します。
✅ ファイルオブジェクト
open() 関数などで取得されるオブジェクトです。Pythonにおいてファイルオブジェクトはイテレータの一種として設計されているため、1行ずつ読み進めると消費され、読み切ると中身がなくなります。
✅ enumerate()
イテラブルを受け取り、インデックス(番号)と要素を同時に返すイテレータを生成する関数です。これ自体がイテレータを返すため、一度 for 文で回すと中身は消費されます。

この記事へのコメント