「else って if と一緒に使うものでしょ?」と思っていませんか?実は Python では、for や while ループにも else を付けることができます。知らなかった方も多いのではないでしょうか。この記事では、ループの else がどんな動きをするのか、どんな場面で役立つのかを、わかりやすいサンプルコードを使って丁寧に解説します!
ループの else ってどういう意味?

Python の for や while には、else ブロックを追加することができます。ポイントはたった一つです。
ループが「途中で break されずに」正常に終了したとき、else ブロックが実行される
逆に言うと、break でループを抜けた場合は else ブロックは実行されません。この「break されたかどうか」を判定できるのが、ループ else の最大の特徴です。
日常生活に例えると、こんなイメージです。
冷蔵庫の中を全部チェックして、プリンが見つからなかったら「プリンがない!」と報告する。
途中でプリンが見つかったら(break)、そのまま終了して報告はしない。
for ループで else を使ってみよう
基本的な書き方
for i in range(5):
print(i)
else:
print("ループが最後まで終わりました")
# 出力結果
0
1
2
3
4
ループが最後まで終わりました
このように、break なしでループが終わると else ブロックが動きます。では、途中で break した場合はどうなるでしょう?
for i in range(5):
if i == 3:
print(f"{i} で break します")
break
print(i)
else:
print("ループが最後まで終わりました")
# 出力結果
0
1
2
3 で break します
break が実行されたので、else ブロックは実行されませんでした。この動きがポイントです!
実用例① リストの中から目的の値を探す
最もよく使われるのが「リストの中に特定の値があるかどうか」を調べるケースです。else を使わない場合と比べてみましょう。
else を使わない場合(フラグ変数が必要)
fruits = ["apple", "banana", "grape", "mango"]
target = "grape"
found = False # フラグ変数が必要
for fruit in fruits:
if fruit == target:
print(f"{target} が見つかりました!")
found = True
break
if not found:
print(f"{target} は見つかりませんでした")
「見つかったかどうか」を記録するための found というフラグ変数が必要になり、コードが少し複雑になります。
else を使った場合(スッキリ!)
fruits = ["apple", "banana", "grape", "mango"]
target = "grape"
for fruit in fruits:
if fruit == target:
print(f"{target} が見つかりました!")
break
else:
print(f"{target} は見つかりませんでした")
フラグ変数が不要になり、コードがグッとスッキリしました。「break されなかった=見つからなかった」という意味が自然に表現できています。
実用例② 素数かどうか判定する
ループ else の代表的な使い道として「素数判定」があります。素数とは、1 と自分自身以外に割り切れる数がない整数のことです。
def is_prime(n):
if n < 2:
return False
for i in range(2, n):
if n % i == 0:
print(f"{n} は {i} で割り切れるので素数ではありません")
break
else:
# ループが最後まで終わった = 割り切れる数がなかった = 素数!
print(f"{n} は素数です")
return True
return False
is_prime(7)
is_prime(10)
# 出力結果
7 は素数です
10 は 2 で割り切れるので素数ではありません
割り切れる数が一つも見つからずにループが終了した場合=素数、と非常に直感的に書けます。
while ループでも else は使える
for だけでなく、while にも同じように else を付けることができます。動きは同じで「break されずにループが終了したときに実行」されます。
count = 0
max_try = 5
secret = 3 # 正解の数字
while count < max_try:
guess = int(input(f"数字を当ててください(残り {max_try - count} 回): "))
if guess == secret:
print("正解です!おめでとう!")
break
count += 1
else:
# max_try 回試みて break されなかった = 全部外れ
print(f"{max_try} 回外れました。正解は {secret} でした。")
数字当てゲームの例です。制限回数以内に正解すれば break で抜け、else は実行されません。回数を使い切った場合のみ「正解は〇〇でした」と表示されます。ゲームのような「試行回数を使い果たした場合の処理」を書くのにとても向いています。
注意点:else の位置に気をつけよう
ループの else を使うときに気をつけてほしいのが、インデント(字下げ)の位置です。else は for や while と同じインデントレベルに書きます。
# ✅ 正しい書き方
for i in range(3):
print(i)
else: # for と同じ位置
print("完了")
# ❌ よくある間違い(else が if と対応しているように見えてしまう)
for i in range(3):
if i == 1:
print("1 を発見")
else: # これは for ではなく if の else!
print(i)
特に for の中に if がある場合、else がどちらに対応しているか混乱しやすいので注意しましょう。
まとめ:ループの else を使いこなそう
最後に、ループの else の動きと使いどころを表にまとめます。
| 状況 | else ブロックは実行される? |
|---|---|
| ループが最後まで正常に終了した | ✅ 実行される |
| break でループを抜けた | ❌ 実行されない |
| continue を使った(break なし) | ✅ 実行される |
| ループの対象が空(空リストなど) | ✅ 実行される |
ループ else が向いているケース
- リストの中から特定の値を探す処理(見つからなかったときの処理を書く)
- 素数判定など「一度も条件に合わなかった」ことを検知したいとき
- 数字当てゲームなど「試行回数を使い果たした」ことを検知したいとき
- フラグ変数を使わずにコードをスッキリさせたいとき
「else は if と使うもの」という固定観念を外して、ループにも使えると覚えておくだけでコードの可読性がぐっと上がります。最初は「なんか不思議」と感じるかもしれませんが、使ってみると「あ、便利!」と思える場面が必ず出てきますよ。ぜひ自分のコードに取り入れてみてください!




