Python | Break を使わずに同じ課題を解く方法(フラグ変数だけ、または関数の return だけ)

Python Python
スポンサーリンク

「最初に現れる3の倍数を見つけて、見つかったら全体の探索を終了して位置を出力する」を、あえて break なしで解く方法を、初心者向けに分かりやすく説明します。


考え方の全体像

  • 目的: 条件が満たされたら「それ以上、探索を続けない」こと。
  • アプローチ1(フラグ変数だけ): 状態を管理して、ループ継続条件にフラグを組み込み、ループ自体を止める。
  • アプローチ2(関数の return だけ): 条件が満たされた瞬間に「関数ごと」終了する。

フラグ変数だけで止める(while でループ条件に組み込む)

for は「途中で止める」には break が必要ですが、while なら「条件が満たされたら回さない」形にできます。フラグをループ条件に組み込んで、早期終了を実現します。

grid = [
    [2, 5, 7],
    [4, 9, 11],
    [8, 13, 15]
]

found = False
i = 0

# 外側ループ:見つかっていない間だけ、行を進める
while i < len(grid) and not found:
    row = grid[i]
    j = 0
    # 内側ループ:見つかっていない間だけ、列を進める
    while j < len(row) and not found:
        val = row[j]
        if val % 3 == 0:
            print("最初に見つけた3の倍数:", val, "(位置: 行", i, "列", j, ")")
            found = True  # 以降、両方の while が止まる
        j += 1
    i += 1

if not found:
    print("3の倍数は見つかりませんでした")
Python
  • ポイント: while の条件に not found を入れることで、“見つかったら回さない”を素直に表現。
  • メリット: break を使わずに、外側・内側の両方のループを止められる。
  • 注意: インデックス操作が必要になるので、for より少しコード量が増える。

関数の return だけで止める(見つかったら関数終了)

「見つかったら処理全体を終わりたい」なら、関数化して return で抜けるのが最もシンプルです。break は不要です。

def find_first_multiple_of_three(grid):
    for i, row in enumerate(grid):
        for j, val in enumerate(row):
            if val % 3 == 0:
                return (val, i, j)  # 見つかったら関数ごと終了
    return None  # 見つからなかった場合

grid = [
    [2, 5, 7],
    [4, 9, 11],
    [8, 13, 15]
]

result = find_first_multiple_of_three(grid)

if result:
    val, i, j = result
    print("最初に見つけた3の倍数:", val, "(位置: 行", i, "列", j, ")")
else:
    print("3の倍数は見つかりませんでした")
Python
  • ポイント: 「見つかったら“処理全体”を終える」意図が、return 一発で明確。
  • メリット: 読みやすく、テストや再利用がしやすい。初心者にも挙動が直感的。

もう少し Python っぽく書く方法(ジェネレータ+next)

break を使わずに“最初に一致したもの”を取るなら、ジェネレータ式と next が便利です。短く、読みやすく書けます。

grid = [
    [2, 5, 7],
    [4, 9, 11],
    [8, 13, 15]
]

# (val, i, j) を順番に生成し、最初に条件を満たすものを取り出す
found = next(
    ((val, i, j)
     for i, row in enumerate(grid)
     for j, val in enumerate(row)
     if val % 3 == 0),
    None  # 見つからない場合のデフォルト
)

if found is not None:
    val, i, j = found
    print("最初に見つけた3の倍数:", val, "(位置: 行", i, "列", j, ")")
else:
    print("3の倍数は見つかりませんでした")
Python
  • ポイント: next(generator, default) は“最初の一致”を取る定番テクニック。
  • メリット: 早期打ち切りが自動で行われ、コードが短くなる。

どれを選べばいい?(使い分け)

  • フラグ+while: スクリプト中で break を封印したい、または「ループ条件に意味を持たせたい」時。
  • 関数+return: 最も読みやすく、再利用しやすい。基本はこれを選ぶのがおすすめ。
  • next+ジェネレータ: Python に慣れてきたら有力。簡潔で、意図(最初の一致)が明快。

小さなプログラムでは「関数+return」が一番わかりやすい選択です。break を無理に避ける必要はありませんが、早期終了の意図を明確にすることが何より大切です。

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