Python | ループの else 節と break の関係を図解で理解する

Python Python
スポンサーリンク

「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
  • 成功時: 途中で breakelse は実行されない。
  • 失敗時: 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 がある: 最初の一件で breakelse はスキップ。
  • ERROR がない: 最後まで回って break なし → else で「エラーなし」を報告。

よくある落とし穴とベストプラクティス

  • 落とし穴1: continue と混同しない
    • continue は「次の反復へ進む」。else の実行可否には影響しない。
  • 落とし穴2: return と break の併用
    • ループ内で return すると関数自体が終わる。else は呼ばれない。探索系では「見つかったら return」「見つからなければ else で return」の形も明瞭。
  • ベストプラクティス: 探索・検証の「見つからなかった/問題なかった」を else に置く
    • 「最後まで回ったが中断されなかった」ことを利用して、後処理(未検出・合格)を else にまとめると読みやすい。

まとめの一文

「ループの else は、break が一度も起きなかったときの後処理」。探索・検証・回数制限の「未検出/失敗/合格」などを表現するのに使うと、意図がコードにそのまま刻まれる。

Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました