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