Python多重ループでbreakを使う方法:内側・外側ループの抜け方完全解説

 

はじめに

Pythonプログラミングにおいて、ネストした多重ループ(入れ子ループ)から効率的に抜け出す方法は、初心者が躓きやすいポイントの一つです。単純なbreak文では内側のループしか抜けられないため、外側のループも含めて抜け出したい場合には工夫が必要です。

基本的なbreak文の動作

単一ループでのbreak

for i in range(5):
    if i == 3:
        break
    print(i)
# 出力: 0, 1, 2

多重ループでの基本的なbreak

for i in range(3):
    for j in range(3):
        if j == 1:
            break  # 内側のループのみ終了
        print(f"i={i}, j={j}")

出力結果:

i=0, j=0
i=1, j=0
i=2, j=0

上記の例では、breakは内側のループのみを終了し、外側のループは継続されます。

多重ループから完全に抜け出す方法

1. フラグ変数を使用する方法

最も基本的で理解しやすい方法です。

found = False
for i in range(3):
    for j in range(3):
        if i == 1 and j == 1:
            found = True
            break
    if found:
        break
    print(f"処理中: i={i}")

2. else節を活用する方法

Pythonのfor-else構文を利用した方法です。

for i in range(3):
    for j in range(3):
        if i == 1 and j == 1:
            break
    else:
        print(f"内側ループ完了: i={i}")
        continue
    break  # 内側でbreakが実行された場合のみ到達

3. 関数に分割する方法(推奨)

最もPythonicで読みやすい方法です。

def find_target():
    for i in range(3):
        for j in range(3):
            if i == 1 and j == 1:
                return True
    return False

if find_target():
    print("見つかりました")

4. 例外を使用する方法

特殊なケースで使用される方法です。

class LoopBreak(Exception):
    pass

try:
    for i in range(3):
        for j in range(3):
            if i == 1 and j == 1:
                raise LoopBreak
            print(f"i={i}, j={j}")
except LoopBreak:
    print("多重ループを終了しました")

実践的な使用例

1. 2D配列での要素検索

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

def find_number(target):
    for i, row in enumerate(matrix):
        for j, num in enumerate(row):
            if num == target:
                return i, j
    return None

result = find_number(5)
print(f"5の位置: {result}")  # (1, 1)

2. 条件に合う組み合わせを探す

def find_sum_pair(numbers, target):
    for i in range(len(numbers)):
        for j in range(i + 1, len(numbers)):
            if numbers[i] + numbers[j] == target:
                return numbers[i], numbers[j]
    return None

nums = [1, 3, 5, 7, 9]
pair = find_sum_pair(nums, 8)
print(f"合計が8になるペア: {pair}")  # (3, 5)

3. パスワード生成での条件チェック

import random
import string

def generate_valid_password():
    for attempt in range(100):  # 最大100回試行
        password = ""
        for length in range(8, 13):  # 8-12文字
            char = random.choice(string.ascii_letters + string.digits)
            password += char
            if len(password) >= 8 and any(c.isdigit() for c in password):
                return password
    return None

continue文との組み合わせ

多重ループではcontinue文の動作も理解が重要です。

for i in range(3):
    for j in range(3):
        if j == 1:
            continue  # 内側ループの次の反復へ
        print(f"i={i}, j={j}")

出力結果:

i=0, j=0
i=0, j=2
i=1, j=0
i=1, j=2
i=2, j=0
i=2, j=2

while文での多重ループ

i = 0
while i < 3:
    j = 0
    while j < 3:
        if i == 1 and j == 1:
            break
        print(f"i={i}, j={j}")
        j += 1
    i += 1

パフォーマンスの考慮事項

早期終了でパフォーマンス向上

# 効率的な検索
def efficient_search(data, target):
    for row in data:
        for item in row:
            if item == target:
                return True  # 見つかったらすぐに終了
    return False

# 大きなデータセットでのテスト
large_data = [[i*j for j in range(1000)] for i in range(1000)]
found = efficient_search(large_data, 5000)

よくある間違いとその対策

1. break文の位置を間違える

# 間違った例
for i in range(3):
    for j in range(3):
        print(f"i={i}, j={j}")
        if i == 1:
            break  # 位置が不適切

2. フラグ変数を更新し忘れる

# 間違った例
found = False
for i in range(3):
    for j in range(3):
        if i == 1 and j == 1:
            break
    if found:  # foundが更新されていない
        break

推奨される書き方

1. 関数分割が最優先

def process_matrix(matrix):
    for row in matrix:
        for item in row:
            if condition_met(item):
                return item
    return None

2. 明確な変数名を使用

should_exit = False
for outer_index in range(limit):
    for inner_index in range(limit):
        if target_found:
            should_exit = True
            break
    if should_exit:
        break

3. コメントで意図を明確化

for i in range(rows):
    for j in range(cols):
        if matrix[i][j] == target:
            # 目標値が見つかったので両方のループを終了
            break
    else:
        continue  # 内側ループが正常完了した場合は外側ループ継続
    break  # 内側ループでbreakした場合のみここに到達

まとめ

Python多重ループでのbreak処理には以下の方法があります:

推奨度順:

  1. 関数分割 – 最も読みやすく保守性が高い
  2. フラグ変数 – シンプルで理解しやすい
  3. for-else構文 – Pythonicだが理解に注意が必要
  4. 例外処理 – 特殊なケースのみ使用

重要なポイント:

  • 単純なbreakは内側のループのみ終了
  • 外側のループも終了したい場合は工夫が必要
  • 可能な限り関数分割を使用する
  • フラグ変数を使う場合は更新を忘れずに
  • コードの可読性を最優先に考える

適切な方法を選択することで、効率的で保守性の高いコードを書くことができます。

関連記事

  • Python for文とwhile文の使い方
  • Python関数の定義と戻り値の活用
  • Pythonリスト内包表記の完全ガイド

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座