4.

Python break文の使い方|for・whileを抜ける・else節・多重ループ

編集
この記事の要点
  • breakfor / while ループをその場で抜ける制御文
  • 抜けるのはもっとも内側のループ 1 段だけ。多重ループを一気に抜けるには工夫が必要
  • for...else / while...elseelse 節は break しなかったときだけ実行される
  • continue(次の周回へスキップ)と混同しないこと
  • 無限ループ while True:正規の終了手段として頻出

break とは

breakforwhile による繰り返し処理をその時点で打ち切り、ループの外へ抜ける制御文です。条件にあてはまる要素が見つかった瞬間に探索を打ち切る、無限ループを終了させる、といった場面で使います。

基本構文

# while で使う例
n = 0
while True:
    n += 1
    print(n)
    if n == 10:
        break   # ← ここで while を抜ける

# 出力: 1 〜 10

for ループで使う

# 最初に見つかった偶数で打ち切る
nums = [1, 3, 5, 4, 7, 9]
for n in nums:
    if n % 2 == 0:
        print(f"最初の偶数: {n}")
        break
# 出力: 最初の偶数: 4

break / continue / pass の違い

意味典型用途
breakループを抜ける条件を満たしたら以降不要
continue次の周回へ進む(残りスキップ)特定要素だけ処理を飛ばす
pass何もしない(構文的に必要な場所の埋め草)空関数・空クラス
for i in range(5):
    if i == 2:
        continue   # i=2 はスキップ(ループは続行)
    if i == 4:
        break      # i=4 でループ脱出
    print(i)
# 出力: 0, 1, 3

for...else / while...else の挙動

Python では for / whileelse 節を付けられます。これは「break せずにループが終わったとき」だけ実行される、少し珍しい構文です。

nums = [1, 3, 5, 7]
for n in nums:
    if n == 4:
        print("発見")
        break
else:
    # break しなかったときに実行される
    print("見つかりませんでした")
# 出力: 見つかりませんでした

nums = [1, 3, 4, 5]
for n in nums:
    if n == 4:
        print("発見")
        break
else:
    print("見つかりませんでした")
# 出力: 発見

多重ループを抜けたいとき

break はもっとも内側のループ 1 段だけ抜けます。Python には break n のような構文はないので、以下のいずれかで対応します。

方法 1: フラグ変数

found = False
for i in range(10):
    for j in range(10):
        if i * j == 42:
            found = True
            break
    if found:
        break
print(i, j)

方法 2: 関数化して return

def find_pair():
    for i in range(10):
        for j in range(10):
            if i * j == 42:
                return i, j
    return None

print(find_pair())

方法 3: for...else を活用

for i in range(10):
    for j in range(10):
        if i * j == 42:
            break
    else:
        # 内側ループが break しなかったら次の i へ
        continue
    # 内側で break が起きたらここで外側 break
    break
print(i, j)

典型的な使い方

無限ループの終了

while True:
    cmd = input("> ")
    if cmd in ("quit", "exit"):
        break
    print(f"入力: {cmd}")

線形探索の早期打ち切り

target = "Bob"
for name in ["Alice", "Bob", "Carol"]:
    if name == target:
        print("見つかった")
        break

条件付き集計の打ち切り

# 合計が 100 を超えたら止める
total = 0
nums = [30, 25, 20, 40, 15, 50]
for n in nums:
    total += n
    if total > 100:
        break
print(total)   # 115(30+25+20+40 まで足した次の n=15+... ではない)

他言語の break との比較

言語挙動
Pythonbreak で 1 段抜ける。多重抜けは構文なし
Javabreak label; でラベル付きループまで一気に抜けられる
JavaScriptJava と同じくラベル可
Gobreak LABEL でラベル付き可
C / C++1 段のみ。多重は goto やフラグ

よくある落とし穴

  • if の中ではなくループ外に書いてしまい構文エラー(break は必ずループ内で)
  • 2 重ループの内側で break しても外側ループは継続
  • for...else の else 節は「break しなかったとき」に動く(直感と逆になりがち)
  • 探索後に「見つかったかどうか」を区別したいなら、フラグ変数か for...else を使う

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 条件分岐 (if文)
  2. 繰り返し処理(while文)
  3. 繰り返し処理
  4. 繰り返しの中断 (break)
  5. 繰り返しのスキップ (continue)

最近更新/作成されたページ