「最初に現れる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を無理に避ける必要はありませんが、早期終了の意図を明確にすることが何より大切です。


