3秒でわかる
要素を順に取り出して同じ処理を繰り返すこと。ループの正式な呼び名で、反復子を通して先頭から末尾までを一巡する動きを指します。
もう少し詳しく
どういうものか
イテレーションは、集まりの中の要素を先頭から順に1つずつ取り出して同じ処理を繰り返すことです。日本語では反復と訳します。多くの言語には、この繰り返しを担当する反復子という仕組みがあり、次の要素を取り出す操作と、もう要素が無いことを伝える操作を持っています。for文はその反復子を裏で回しているだけです。なお、アジャイル開発では1〜4週間の開発サイクルもイテレーションと呼びます。同じ語で別の概念を指すので、文脈で読み分けます。
なぜ必要か
添字を自分で管理する書き方は、最後の1件を処理し損ねる誤りや、範囲外へはみ出す誤りを生みます。反復子に任せると、終わりの判定を書かなくてよくなり、こうした境界の間違いが構造的に起きなくなります。さらに、要素を先に全部作らず必要になった時点で1つずつ生成する遅延評価が可能になり、巨大なファイルを1行ずつ処理してもメモリを使い切りません。
具体例
rows = ["apple,3", "banana,5", "cherry,2"]
# 反復子に任せる書き方。終端の判定を書かなくてよい
for row in rows:
name, count = row.split(",")
print(name, int(count))
# 添字と値の両方が要るときは enumerate を使う
for i, row in enumerate(rows, start=1):
print(i, row)
# ファイルは1行ずつ取り出されるので、巨大でもメモリに載せずに済む
with open("access.log") as f:
for line in f:
if "500" in line:
print(line.rstrip())つまずきやすいところ
繰り返しの最中に元のリストへ追加や削除を行うと、要素が飛ばされたり無限に回り続けたりします。消すときは新しいリストを作るか、後ろから走査します。もうひとつはジェネレータの使い切りです。一度最後まで回した反復子は空になっているため、二度目のループでは何も出てきません。二度使うならリストへ変換してから回します。
似た用語との違い
| 語 | 意味 |
|---|---|
| イテレーション | 要素を順に処理する繰り返しそのもの |
| イテラブル | 繰り返しの対象にできる集まり |
| イテレータ | 次の要素を取り出す役目を持つ実体 |
| 再帰 | 関数が自分自身を呼んで繰り返す別の手段 |
覚え方
添字を自分で数え始めたら、その言語に用意された反復の書き方を探すほうが速い、と考えると誤りを減らせます。何番目かではなく、次は何か、という問いに置き換えるのが反復子の発想です。