Pythonのイテレータ入門|初心者向けにわかりやすく解説(コード例付き) | スクラムとは 仕事が進まなく技術力もないリーダーのごっこ遊び

Pythonを学ぶ中で、リストやタプルのようなデータ構造を使うことが多いですが、その裏で動いている「イテレータ(Iterator)」の仕組みを理解していますか?

イテレータは、データを1つずつ取り出す仕組みを持つオブジェクトで、メモリ効率の良いプログラミングを可能にします。本記事では、初心者の方にも分かりやすく、Pythonのイテレータの基礎から応用までを徹底解説します。

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) を実行すると、リストの次の要素が取得されます。

Pythonのイテレータ入門|初心者向けにわかりやすく解説(コード例付き)


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)を使うと簡単にイテレータを作成できる
メモリ効率が良く、大量データの処理に向いている