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 文の裏側を知ることで、カスタムイテレータやジェネレータを作る際の理解が深まります。