Python の for 文の裏側で何が起きているか

Python の for 文はシンプルに見えますが、内部ではイテレータプロトコルが動いています。その仕組みを理解すると、Python のループ処理がより深く理解できます。

for 文の基本

普段何気なく書いている for 文を見てみましょう。

numbers = [1, 2, 3]
for n in numbers:
    print(n)

この3行のコードの裏側では、実は複数のステップが実行されています。

裏側の動作

for 文は内部で以下の処理を行っています。

iter() でイテレータを取得

next() で要素を1つ取り出す

StopIteration が発生するまで繰り返す

ループ終了

これを明示的に書くと、次のようになります。

numbers = [1, 2, 3]
iterator = iter(numbers)

while True:
    try:
        n = next(iterator)
        print(n)
    except StopIteration:
        break

iter() と next() の役割

iter() はオブジェクトの __iter__() メソッドを呼び出し、イテレータを返します。next() はイテレータの __next__() メソッドを呼び出し、次の要素を返します。

text = "ABC"
it = iter(text)

print(next(it))  # A
print(next(it))  # B
print(next(it))  # C
print(next(it))  # StopIteration 例外が発生

なぜこの仕組みがあるのか

この仕組みのおかげで、どんなオブジェクトでも __iter__()__next__() を実装すれば for 文で使えるようになります。リスト、文字列、ファイル、ジェネレータなど、あらゆるものが同じ方法で繰り返し処理できるのはこのためです。

# ファイルもイテラブル
with open("data.txt") as f:
    for line in f:  # 1行ずつイテレート
        print(line)

for 文の裏側を知ることで、カスタムイテレータやジェネレータを作る際の理解が深まります。