Pythonを学ぶ中で、リストやタプルのようなデータ構造を使うことが多いですが、その裏で動いている「イテレータ(Iterator)」の仕組みを理解していますか?
イテレータは、データを1つずつ取り出す仕組みを持つオブジェクトで、メモリ効率の良いプログラミングを可能にします。本記事では、初心者の方にも分かりやすく、Pythonのイテレータの基礎から応用までを徹底解説します。
1. イテレータとは?イテラブルとの違いを理解しよう
まず、イテラブル(Iterable) と イテレータ(Iterator) の違いを整理しましょう。
| 用語 | 説明 |
|---|---|
| イテラブル(Iterable) | for ループで繰り返し処理ができるオブジェクト(リスト、タプル、文字列など) |
| イテレータ(Iterator) | next() を使って1つずつ要素を取り出せるオブジェクト |
イテラブルなオブジェクトは iter() 関数を使ってイテレータを作成できます。
イテラブルなオブジェクトの例
my_list = [1, 2, 3] for item in my_list: print(item)
この for ループの裏では イテレータが自動的に使われています!
2. イテレータの作成と使用方法
イテラブルオブジェクトから iter() を使ってイテレータを作成し、next() で要素を取得できます。
my_list = [10, 20, 30] it = iter(my_list) # イテレータを作成 print(next(it)) # 10 print(next(it)) # 20 print(next(it)) # 30 # print(next(it)) # StopIteration エラー(要素がもうない)
next(it) を実行すると、リストの次の要素が取得されます。
3. 独自のイテレータを作成する方法
Pythonでは __iter__() と __next__() を実装することで、独自のイテレータを作成できます。
カウンターを作るイテレータ
class Counter: def __init__(self, start, end): self.current = start self.end = end def __iter__(self): return self def __next__(self): if self.current >= self.end: raise StopIteration self.current += 1 return self.current - 1 counter = Counter(1, 5) for num in counter: print(num)
4. ジェネレータを使って簡単にイテレータを作成
イテレータの作成が面倒な場合は、ジェネレータ(Generator) を使うと簡単に作れます。
カウントアップするジェネレータ
def counter(start, end): while start < end: yield start # 値を返して一時停止 start += 1 for num in counter(1, 5): print(num)
yield を使うことで、状態を保持したまま実行を中断し、次回呼び出し時に再開 できます。
5. イテレータを使うメリットとは?
1. メモリ効率が良い
リストを使うと全データをメモリに保持しますが、イテレータは必要なときに要素を生成 するため、メモリ使用量が抑えられます。
import sys lst = [i for i in range(1000000)] # リスト iter_gen = (i for i in range(1000000)) # ジェネレータ print(sys.getsizeof(lst)) # 数MB print(sys.getsizeof(iter_gen)) # 数十バイト
2. 処理の高速化が可能
イテレータは逐次処理を行うため、大規模データを扱う場合に高速処理が可能です。
6. まとめ
✅ イテラブル は for ループで繰り返し処理ができるオブジェクト
✅ イテレータ は next() で要素を1つずつ取得できるオブジェクト
✅ iter() を使うとイテラブルからイテレータを作れる
✅ __iter__() と __next__() を実装すると独自のイテレータを作成可能
✅ ジェネレータ(yield)を使うと簡単にイテレータを作成できる
✅ メモリ効率が良く、大量データの処理に向いている

