3秒でわかる
同じ処理を条件が成り立つ間くり返す構文。データの件数が実行するまで分からなくても、1つの同じコードで最後まで処理できます。
30秒図解
もう少し詳しく
どういうものか
ループは、決めた条件が成り立つ間や、集まりの要素が続く間、同じ処理をくり返す構文です。回数が決まっているときのfor、条件で続けるwhile、集まりを1つずつ取り出す拡張for(foreach)が代表的な形です。中身のコードは1回分だけ書き、それを何度実行するかを構文側が決めます。
なぜ必要か
処理するデータの件数は、実行するまで分かりません。3件のときは3行、1万件のときは1万行のコードを書く、という作り方は成立しません。ループを使うと、件数に関係なく同じコードで処理でき、件数が変わってもコードは1文字も変える必要がありません。
具体例
# 集まりを1つずつ取り出す形が最も読みやすい
prices = [480, 320, 550]
total = 0
for p in prices:
total += p
print(total) # 1350
# 番号も同時に欲しいときは enumerate を使う
for i, p in enumerate(prices, start=1):
print(i, p)
# 終わる条件が回数ではないときは while
count = 0
while total > 100:
total //= 2
count += 1// <a href="/glossary/javascript" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">JavaScript</a> では for...of が同じ役割を持つ
for (const p of prices) total += p;つまずきやすいところ
第一に、終わらないループです。whileの条件で使う変数を中で更新し忘れると、プログラムが固まります。書いた直後に「この変数はどこで変わるか」を確認します。第二に、ループの中で1件ずつDBへ問い合わせる書き方です。100件のリストに対して100回の通信が走り、極端に遅くなります。まとめて1回で取得してから回します。第三に、くり返しの最中に対象のリストへ追加や削除を行うと、要素が飛ばされたり無限に増えたりします。新しいリストを作って入れ替える形にします。
似た用語との違い
再帰も同じ処理をくり返しますが、自分自身を呼び出す形で深さが積み上がり、深くなりすぎると停止します。木構造をたどるような処理には再帰、並んだデータを順に処理するにはループが向いています。
覚え方
ループを書く前に「何を、いつまで、何回」を言葉にします。件数が決まっているならfor、条件次第ならwhile、集まりを順に見るなら拡張forが対応します。
件数が多いときは、ループの中で何回通信や計算が起きるのかを数える習慣が効きます。1件あたり1回の処理でも、1万件なら1万回です。
処理の途中で抜けたいときはbreak、次の回へ飛ばしたいときはcontinueを使います。どちらも深い入れ子の中では読みにくくなるため、条件を関数へ切り出すと見通しが戻ります。