Python | Break を使うべきケース集

Python
スポンサーリンク

「break」は、ループを“ここで終わり”と明確に区切るためのスイッチ。初心者ほど、適切な場面で使えるとコードがグッと読みやすくなります。具体例を交えて、使うべきパターンをわかりやすく整理します。


基本の考え方

  • 役割: ループの途中で処理を打ち切るための早期終了。
  • 狙い: 無駄な繰り返しを避け、意図(終わる理由)をはっきり示す。
  • 合言葉: 「条件が満たされたら、もう回さない」。

使うべきケース1: 探し物が見つかったら即終了(検索)

「見つけたら終わり」が一目で伝わる、最も典型的な使いどころです。

numbers = [3, 7, 12, 18, 25]
target = 18

for n in numbers:
    if n == target:
        print("見つけた!インデックス:", numbers.index(n))
        break
else:
    # ループが break されずに最後まで回った時だけ実行
    print("見つからなかった…")
Python
  • ポイント: for-else は「見つからなかった処理」をループの隣にまとめられるので読みやすい。
  • メリット: 見つかった瞬間に止められるため、処理時間を節約できる。

使うべきケース2: 入力ループの終了(コマンド/メニュー)

ユーザーが「終了」コマンドを入力した瞬間に止める定番パターン。

while True:
    cmd = input("コマンドを入力(exitで終了)> ")
    if cmd == "exit":
        print("終了します")
        break
    print("受け付けました:", cmd)
Python
  • ポイント: 無限ループに“脱出口”をつけるのが break の仕事。
  • メリット: 余計な条件式で複雑にしない。読み手が挙動を直感で理解できる。

使うべきケース3: リトライ処理(成功したら打ち切り)

成功したらそれ以上試さない。失敗が続いたら諦める。

MAX_RETRY = 5

for attempt in range(1, MAX_RETRY + 1):
    success = try_connect()  # 仮の関数
    if success:
        print("接続成功(試行回数:", attempt, ")")
        break
else:
    print("接続失敗:", MAX_RETRY, "回試してダメでした")
Python
  • ポイント: 成功時の早期終了+失敗し続けた場合のハンドリングをセットで書ける。
  • メリット: ネットワークや外部APIの安定しない処理に有効。

使うべきケース4: 区切り記号・終端までの読み取り(ストリーム/ファイル)

終端マーカーを見つけたらそれ以上読まない。

lines = [
    "HEADER: report",
    "value: 10",
    "value: 20",
    "--END--",
    "value: 999",  # ここ以降は無視
]

for line in lines:
    if line.strip() == "--END--":
        break
    print(line)
Python
  • ポイント: 明確な「ここまで」の合図があるなら break が最短ルート。
  • メリット: 無駄なI/Oを避け、処理の意図も明解。

使うべきケース5: ネストしたループの内側を抜ける(段階的探索)

内側の探索が用済みになったら、すぐ次の外側処理へ移る。

grid = [
    [2, 4, 6],
    [1, 3, 5],
    [10, 12, 14],
]

for row in grid:
    for x in row:
        if x % 2 == 1:  # 最初の奇数が見つかったら、その行の探索を終了
            print("この行に奇数あり:", row)
            break  # 内側の for だけ抜ける
Python
  • ポイント: 「どのループを抜けるか」を読み手が把握できる範囲(浅いネスト)で使う。
  • メリット: 目的が達成された行はすぐ次へ進めるので効率的。

使うべきケース6: 高コストな処理の早期打ち切り(ガード)

条件が満たされた時点で、重い処理を止める。

def has_heavy_condition(values):
    for v in values:
        if is_bad(v):  # 仮の重い判定
            return True  # break と同じ効果(関数なら return が自然)
    return False
Python
  • ポイント: 関数化できる場面では return がより明快だが、ループ内の一部だけ止めたいなら break。
  • メリット: 無駄な計算を避け、応答性を保てる。

使うべきケース7: バリデーションの一発アウト(不正値検出)

不正データを見つけたら、即座に検証を終了し報告する。

data = [12, 14, 18, -1, 22]  # -1 は不正値の例

for i, v in enumerate(data):
    if v < 0:
        print("不正値を検出(index:", i, "value:", v, ")")
        break
else:
    print("すべての値が妥当です")
Python
  • ポイント: 「致命的エラーはすぐ止める」が読みやすく書ける。
  • メリット: 早期に失敗を知らせ、後続処理の誤動作を防ぐ。

初心者が避けたい落とし穴

  • 乱用: あちこちに break を散らすと、どこで終わるのか追いづらい。
  • 深いネスト: どのループを抜けているか分かりにくくなる。関数化+returnを検討。
  • 本来の条件で書ける場面: ループ範囲や条件で表せるなら、まずはそちらを使う。

練習問題(手を動かして慣れる)

  1. 検索+for-else
    • 課題: リストから「最初の偶数」を見つけて表示。なければ「無し」と表示。
    • ヒント: 見つかったら break、見つからなければ else を使う。
  2. 入力ループ
    • 課題: ユーザーが「ok」を入力したら次へ、「exit」で終了。それ以外は再入力を促す。
    • ヒント: 無限ループに break を仕込む。
  3. リトライ
    • 課題: 3回までダミー関数を呼び出し、成功したら終了。すべて失敗なら「失敗」と表示。
    • ヒント: for attempt in range(3)for-else
  4. 終端マーカー
    • 課題: テキスト行を順に出力し、「–END–」が出たら打ち切る。
    • ヒント: 区切り検出で break

模範解答

1. 検索+for-else

課題: リストから「最初の偶数」を見つけて表示。なければ「無し」と表示。

numbers = [3, 7, 11, 19, 23]  # 偶数がない例

for n in numbers:
    if n % 2 == 0:  # 偶数かどうか判定
        print("最初の偶数:", n)
        break
else:
    # break されなかった場合に実行
    print("偶数は見つかりませんでした")
Python

2. 入力ループ

課題: ユーザーが「ok」を入力したら次へ、「exit」で終了。それ以外は再入力を促す。

while True:
    cmd = input("入力してください(ok/exit)> ")
    if cmd == "ok":
        print("次へ進みます")
    elif cmd == "exit":
        print("終了します")
        break
    else:
        print("不正な入力です。もう一度入力してください")
Python

3. リトライ

課題: 3回までダミー関数を呼び出し、成功したら終了。すべて失敗なら「失敗」と表示。

import random

def try_connect():
    # ダミー:50%の確率で成功
    return random.choice([True, False])

for attempt in range(1, 4):  # 最大3回
    if try_connect():
        print("接続成功!(試行回数:", attempt, ")")
        break
else:
    print("接続失敗:3回試してダメでした")
Python

4. 終端マーカー

課題: テキスト行を順に出力し、「–END–」が出たら打ち切る。

lines = [
    "HEADER: report",
    "value: 10",
    "value: 20",
    "--END--",
    "value: 999",  # ここ以降は無視
]

for line in lines:
    if line.strip() == "--END--":
        break
    print(line)
Python

まとめ

  • 検索系for-else と組み合わせると「見つかった/見つからない」が明快。
  • 入力ループ → 無限ループに「脱出口」をつけるのが break の役割。
  • リトライ処理 → 成功したら即終了、失敗続きなら else でまとめて処理。
  • 終端マーカー → 「ここまで!」をシンプルに書ける。
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました