Pythonのfor文は「for each」スタイル
C系の言語を触ったことがある人なら、Pythonのfor文は少し違って見えるはずです。for (i = 0; i < n; i++)のようなカウンタを回すパターンはありません。Pythonのfor文はあくまで for each 型のループで、コレクションを渡すと要素を1つずつ取り出してくれる仕組みになっています。
これで3行が出力されます。Python はリストを読み込み、要素を1つずつ取り出して color に束縛し、そのたびにループ本体を実行します。要素がなくなったらループは終了です。
書き方の形に注目してください。for <変数名> in <イテラブル>: のあとに、インデントされた本体が続きます。インデント、コロン、本体 — if 文と同じ構造ですね。
イテラブルとは何か
ざっくり言えば、値の並びを持っているものなら何でもイテラブルです。リスト、タプル、文字列、range、辞書、集合、ファイル、そして自分で作るクラスのほとんどもここに含まれます。
文法がひとつで済むのに、扱えるデータの形はこれだけ豊富。ここが Python の for文のありがたいところです。
range() でカウントを回す
「10回繰り返したい」「インデックス0から9までループしたい」というように、カウンタが必要な場面では range() の出番です。
これは 0, 1, 2, 3, 4 を出力します。range(stop) は 0 から始まり、stop の手前までカウントします。開始値を指定したいときは range(start, stop)、刻み幅まで指定したいときは range(start, stop, step) を使います。
range については少し深く知っておく価値があるので、別ページで詳しく解説します。とりあえず今は「range(n) を使うと、0 から n-1 までの n 回ループが回る」と覚えておけば十分です。
python enumerate の使い方:インデックス付きでループする
「値だけじゃなくて、インデックスも一緒に欲しいんだけど……」というのはよくある場面ですよね。初心者がまずやりがちなのは range(len(...)) を使う書き方ですが、Python にはもっとスマートな方法が用意されています。
enumerate() は (インデックス, 値) のペアを返してくれる関数です。for の後ろに変数を2つ書くと、このペアがそれぞれ index と color に アンパック されて受け取れます。次のように書くよりずっとスッキリしますよね。
0ではなく1から数え始めたい場合は、start=1を渡します。
Python zipで2つのシーケンスを同時にループする
長さが同じ2つのリストがあって、それぞれの要素をペアにして扱いたいときに便利なのがzipです。
zip は一番短いシーケンスに合わせて止まります。最後まで回して足りない分を None で埋めたいときは、itertools.zip_longest を使いましょう。
辞書のループ処理
辞書をループするときは、何を対象にするかを選べます。
たいていの場合は .items() を使うのがベストです。キーと値をまとめて取り出せて、1行でスッキリ書けます。
break と continue の違い
ループを途中で抜けたり、特定の回だけスキップしたい場面もありますよね。
break はその場でループを抜けます:
6を超える数が見つかった時点で、ループが停止します。残りの要素は処理されません。
一方の continue は、現在の反復の残りの処理をスキップして、次の反復へ進めます。
どちらを使っても構いませんが、continue がループ内に複数あると処理の流れが追いにくくなることがあります。そういうときは、シンプルな if/else で書いたほうが読みやすいケースも多いです。
ループに付ける else 節
Python には他の言語ではあまり見かけない機能があります。それが、ループに付けられる else 節です。これは、ループが break で中断されずに最後まで回りきったときに実行されます。
便利ではありますが、最初は混乱しがちな構文でもあります。無理に使う必要はありません。ループの外側でbooleanのフラグを使うほうが、初学者には読みやすいことも多いです。
ループ中にリストを変更するのは危険
もう一つ注意しておきたい落とし穴があります。for文でループしている最中に、そのリストに要素を追加したり削除したりしてはいけません。インデックスのどこまでが有効なのかが狂ってしまい、要素を飛ばしてしまったり、エラーが発生したりします。安全なやり方は、新しいリストを作り直すことです。
あるいは、慣れてきたらリスト内包表記を使えば1行で同じことが書けます。こちらはコレクションの章で詳しく扱います。
ちょっとした実践例
ここまでの内容を組み合わせてみましょう。リストを読み込んで、フィルタリングして、enumerate で番号を振って表示する流れです。
次は:while ループ
反復対象がはっきり決まっているときは for が最適です。一方、ある条件が変わるまでループを回したい場合は while の出番になります。続いてその while を見ていきましょう。
よくある質問
Pythonのfor文はどう動くの?
for item in sequence: と書くと、シーケンスの要素を1つずつ item に代入しながらインデント内のブロックを繰り返し実行します。対象になるのはリスト、タプル、文字列、辞書、range、そしてイテレータを定義したオブジェクトなど、いわゆる「iterable」なオブジェクト全般です。
breakとcontinueの違いは?
break はループそのものをその場で抜けます。残りの繰り返しは一切実行されません。一方 continue は「今回のループだけスキップ」して、次の繰り返しに進みます。ざっくり言えば、break は「もう終わり」、continue は「これは飛ばす」というニュアンスです。
ループでインデックス(番号)も一緒に取りたいときは?
enumerate(...) を使えば (index, value) のペアが取れます。for i, item in enumerate(items): と書くだけでOKです。自分で i = 0 を用意して末尾で i += 1 する…みたいなコードよりずっとスッキリ書けます。