Menu
日本語

Python for文の使い方|list・dict・rangeをループ処理

Pythonのfor文の動きを基礎から解説。リスト・文字列・range・辞書のループ処理から、break/continue、for-else、enumerate、zipまで実例でまとめます。

Pythonのfor文は「for each」スタイル

C系の言語を触ったことがある人なら、Pythonのfor文は少し違って見えるはずです。for (i = 0; i < n; i++)のようなカウンタを回すパターンはありません。Pythonのfor文はあくまで for each 型のループで、コレクションを渡すと要素を1つずつ取り出してくれる仕組みになっています。

main.py
Output
Click Run to see the output here.

これで3行が出力されます。Python はリストを読み込み、要素を1つずつ取り出して color に束縛し、そのたびにループ本体を実行します。要素がなくなったらループは終了です。

書き方の形に注目してください。for <変数名> in <イテラブル>: のあとに、インデントされた本体が続きます。インデント、コロン、本体 — if 文と同じ構造ですね。

イテラブルとは何か

ざっくり言えば、値の並びを持っているものなら何でもイテラブルです。リスト、タプル、文字列、range、辞書、集合、ファイル、そして自分で作るクラスのほとんどもここに含まれます。

main.py
Output
Click Run to see the output here.

文法がひとつで済むのに、扱えるデータの形はこれだけ豊富。ここが Python の for文のありがたいところです。

range() でカウントを回す

「10回繰り返したい」「インデックス0から9までループしたい」というように、カウンタが必要な場面では range() の出番です。

main.py
Output
Click Run to see the output here.

これは 0, 1, 2, 3, 4 を出力します。range(stop) は 0 から始まり、stop の手前までカウントします。開始値を指定したいときは range(start, stop)、刻み幅まで指定したいときは range(start, stop, step) を使います。

main.py
Output
Click Run to see the output here.

range については少し深く知っておく価値があるので、別ページで詳しく解説します。とりあえず今は「range(n) を使うと、0 から n-1 までの n 回ループが回る」と覚えておけば十分です。

python enumerate の使い方:インデックス付きでループする

「値だけじゃなくて、インデックスも一緒に欲しいんだけど……」というのはよくある場面ですよね。初心者がまずやりがちなのは range(len(...)) を使う書き方ですが、Python にはもっとスマートな方法が用意されています。

main.py
Output
Click Run to see the output here.

enumerate()(インデックス, 値) のペアを返してくれる関数です。for の後ろに変数を2つ書くと、このペアがそれぞれ indexcolorアンパック されて受け取れます。次のように書くよりずっとスッキリしますよね。

main.py
Output
Click Run to see the output here.

0ではなく1から数え始めたい場合は、start=1を渡します。

main.py
Output
Click Run to see the output here.

Python zipで2つのシーケンスを同時にループする

長さが同じ2つのリストがあって、それぞれの要素をペアにして扱いたいときに便利なのがzipです。

main.py
Output
Click Run to see the output here.

zip は一番短いシーケンスに合わせて止まります。最後まで回して足りない分を None で埋めたいときは、itertools.zip_longest を使いましょう。

辞書のループ処理

辞書をループするときは、何を対象にするかを選べます。

main.py
Output
Click Run to see the output here.

たいていの場合は .items() を使うのがベストです。キーと値をまとめて取り出せて、1行でスッキリ書けます。

break と continue の違い

ループを途中で抜けたり、特定の回だけスキップしたい場面もありますよね。

break はその場でループを抜けます:

main.py
Output
Click Run to see the output here.

6を超える数が見つかった時点で、ループが停止します。残りの要素は処理されません。

一方の continue は、現在の反復の残りの処理をスキップして、次の反復へ進めます。

main.py
Output
Click Run to see the output here.

どちらを使っても構いませんが、continue がループ内に複数あると処理の流れが追いにくくなることがあります。そういうときは、シンプルな if/else で書いたほうが読みやすいケースも多いです。

ループに付ける else

Python には他の言語ではあまり見かけない機能があります。それが、ループに付けられる else 節です。これは、ループが break で中断されずに最後まで回りきったときに実行されます。

main.py
Output
Click Run to see the output here.

便利ではありますが、最初は混乱しがちな構文でもあります。無理に使う必要はありません。ループの外側でbooleanのフラグを使うほうが、初学者には読みやすいことも多いです。

ループ中にリストを変更するのは危険

もう一つ注意しておきたい落とし穴があります。for文でループしている最中に、そのリストに要素を追加したり削除したりしてはいけません。インデックスのどこまでが有効なのかが狂ってしまい、要素を飛ばしてしまったり、エラーが発生したりします。安全なやり方は、新しいリストを作り直すことです。

main.py
Output
Click Run to see the output here.

あるいは、慣れてきたらリスト内包表記を使えば1行で同じことが書けます。こちらはコレクションの章で詳しく扱います。

ちょっとした実践例

ここまでの内容を組み合わせてみましょう。リストを読み込んで、フィルタリングして、enumerate で番号を振って表示する流れです。

main.py
Output
Click Run to see the output here.

次は: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 する…みたいなコードよりずっとスッキリ書けます。

Coddyでコードを学ぼう

始める