LaTeX957300 views
雑学1472593 views
高校日本史189857 views
ヒストリア284143 views
中学英語808712 views
Computer365120 views
小学算数1194618 views
中学理科1626207 views
教育148875 views
中学社会667106 views
Help
Tools

English

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