「for や while の else」は、初心者には直感的でないかもしれません。ポイントは一つだけです。「ループの中で break しなかったら、else が実行される」。これをテキスト図と例題で丁寧に解説します。
ループの else は何を意味するか
- 基本ルール: ループの途中で
breakが発生しなければ、ループが最後まで「正常終了」したとみなされ、else節が実行される。 - よくある誤解: 「ループが1回も回らなかったときに else が動く」ではない。回数ゼロでも「break していない」なら else は動く。逆に途中で break すると else は動かない。
テキスト図で見る挙動
図1: break が起きた場合(else は実行されない)
for x in items:
├─ 条件OK? → break 発生!
└─ ここでループを中断
else:
└─ 実行されない(break があったため)
図2: break が起きない場合(else が実行される)
for x in items:
├─ 条件NG → 次へ
├─ 条件NG → 次へ
└─ 最後まで回り切った(break なし)
else:
└─ 実行される(正常終了の「後処理」)
図3: 0 回ループでも(空の反復)break がなければ else は実行
items = []
for x in items:
└─ 1回も回らない(break なし)
else:
└─ 実行される(正常終了)
例題1: 値の探索(見つかったら break、見つからなければ else)
nums = [3, 8, 12, 21]
target = 12
for n in nums:
if n == target:
print("見つかった:", n)
break
else:
print("見つからなかった")
Python- 結果: 「見つかった: 12」
- 理由: 途中で
breakしたので、elseは実行されない。
ターゲットを 10 に変えると:
target = 10
for n in nums:
if n == target:
print("見つかった:", n)
break
else:
print("見つからなかった")
Python- 結果: 「見つからなかった」
- 理由: 最後まで回ったが
breakが一度も起きていないためelseが実行される。
例題2: 素数判定(for-else を活かす定番パターン)
def is_prime(n):
if n < 2:
return False
for d in range(2, int(n ** 0.5) + 1):
if n % d == 0:
# 割り切れた → 素数ではない
return False
else:
# ループ中に割り切れる d が見つからず break も return もない
return True
print(is_prime(11)) # True
print(is_prime(12)) # False
Python- ポイント: 「割り切れる d が見つかったら途中終了(return/本来は break)。見つからずに最後まで回ったら素数確定」を
elseに置くと、処理の意図が明快になる。
例題3: パスワード再入力(回数制限付きループと else)
correct = "abc123"
for attempt in range(3): # 3回まで
pwd = input("パスワード> ")
if pwd == correct:
print("ログイン成功")
break
else:
print("失敗が続いたためロックしました")
Python- 成功時: 途中で
break→elseは実行されない。 - 失敗時: 3回すべて外して
breakなし →elseが「失敗後処理」として実行。
例題4: ファイルの最初のエラー行だけ報告し、なければ「正常」を報告
lines = [
"INFO: 起動",
"INFO: 接続",
"ERROR: タイムアウト",
"INFO: 再試行"
]
for i, line in enumerate(lines, start=1):
if line.startswith("ERROR"):
print(f"最初のエラーは {i} 行目: {line}")
break
else:
print("エラーはありません")
Python- ERROR がある: 最初の一件で
break。elseはスキップ。 - ERROR がない: 最後まで回って
breakなし →elseで「エラーなし」を報告。
よくある落とし穴とベストプラクティス
- 落とし穴1: continue と混同しない
continueは「次の反復へ進む」。elseの実行可否には影響しない。
- 落とし穴2: return と break の併用
- ループ内で
returnすると関数自体が終わる。elseは呼ばれない。探索系では「見つかったら return」「見つからなければ else で return」の形も明瞭。
- ループ内で
- ベストプラクティス: 探索・検証の「見つからなかった/問題なかった」を else に置く
- 「最後まで回ったが中断されなかった」ことを利用して、後処理(未検出・合格)を
elseにまとめると読みやすい。
- 「最後まで回ったが中断されなかった」ことを利用して、後処理(未検出・合格)を
まとめの一文
「ループの else は、break が一度も起きなかったときの後処理」。探索・検証・回数制限の「未検出/失敗/合格」などを表現するのに使うと、意図がコードにそのまま刻まれる。


