「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を検討。 - 本来の条件で書ける場面: ループ範囲や条件で表せるなら、まずはそちらを使う。
練習問題(手を動かして慣れる)
- 検索+for-else
- 課題: リストから「最初の偶数」を見つけて表示。なければ「無し」と表示。
- ヒント: 見つかったら
break、見つからなければelseを使う。
- 入力ループ
- 課題: ユーザーが「ok」を入力したら次へ、「exit」で終了。それ以外は再入力を促す。
- ヒント: 無限ループに
breakを仕込む。
- リトライ
- 課題: 3回までダミー関数を呼び出し、成功したら終了。すべて失敗なら「失敗」と表示。
- ヒント:
for attempt in range(3)+for-else。
- 終端マーカー
- 課題: テキスト行を順に出力し、「–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("偶数は見つかりませんでした")
Python2. 入力ループ
課題: ユーザーが「ok」を入力したら次へ、「exit」で終了。それ以外は再入力を促す。
while True:
cmd = input("入力してください(ok/exit)> ")
if cmd == "ok":
print("次へ進みます")
elif cmd == "exit":
print("終了します")
break
else:
print("不正な入力です。もう一度入力してください")
Python3. リトライ
課題: 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回試してダメでした")
Python4. 終端マーカー
課題: テキスト行を順に出力し、「–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でまとめて処理。 - 終端マーカー → 「ここまで!」をシンプルに書ける。
