🐍 東大の教材で学ぶ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の標準ライブラリには、イテレータを効率的に操作するためのツール群(無限ループや組み合わせ生成など)が用意されています。複雑なループ処理を驚くほどシンプルに書けるようになります。 - 🧠 メモリ効率と実行速度
「リスト(イテラブル)」は全ての値をメモリに保持しますが、「イテレータ」は次の値の生成方法だけを知っています。数百万件のデータを扱うプロの現場では、この違いがプログラムの動作速度や安定性に直結します。
📚 用語詳細リファレンス(網羅版)
本セクションでは、学習に登場した概念を一つずつ深掘りして解説します。
- ✅ イテラブル (Iterable)
for文のinの直後に置くことができるオブジェクトです。内部に__iter__メソッドを持っており、呼び出すと新しいイテレータを生成します。リスト、タプル、文字列、辞書、rangeオブジェクトなどがこれに該当します。- ✅ イテレータ (Iterator)
- 「現在の進行状況」を保持しながら、要素を一つずつ取り出すためのオブジェクトです。内部に
__next__メソッドを持っています。イテレータは「使い捨て」であり、一度最後まで進むと巻き戻すことはできません。 - ✅ iter() 関数
- イテラブル(素材)からイテレータ(作業員)を作成するための組み込み関数です。
例:it = iter([1, 2, 3])とすることで、リストを操作するイテレータが得られます。 - ✅ next() 関数
- イテレータから「次の要素」を一つ取り出す関数です。呼ぶたびにイテレータの内部状態が一行(あるいは一要素)進みます。
- ✅ StopIteration
- イテレータに「次の要素」がなくなったときに発生する例外です。Pythonの
for文は、この例外を検知することで、エラーとして停止させるのではなく「ループの正常終了」として処理します。 - ✅ ファイルオブジェクト
open()関数などで取得されるオブジェクトです。Pythonにおいてファイルオブジェクトはイテレータの一種として設計されているため、1行ずつ読み進めると消費され、読み切ると中身がなくなります。- ✅ enumerate()
- イテラブルを受け取り、インデックス(番号)と要素を同時に返すイテレータを生成する関数です。これ自体がイテレータを返すため、一度
for文で回すと中身は消費されます。
この記事へのコメント