for-else 構文で break と else を使い分ける
for-else 構文で break と else とは
for 文の else 句を使い、リストに値が見つからなかったときの処理を綺麗に書くパターンを学ぶ。本レッスンでは、for-else 構文で break と else の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
for-else 構文で break と else を使い分ける
Python の for 文には他の言語ではあまり見ない便利な仕組みがあります。それが else 句 です。for-else は「ループが最後まで走り切ったとき (途中で break しなかったとき) に実行されるブロック」を表します。本レッスンでは、リストの中に目的の値が含まれているかを調べる処理を題材に、break と else の合わせ技を学びましょう。
for-else の else は「条件が偽になったら」ではなく「break しなかったら」と読みます。
for-else の構文
for のすぐ後ろに else: を書きます。for が break で抜けたときは else は実行されず、for が最後まで走り切ったときだけ else が実行されます。文章で書くと混乱しやすいので、まずはコードで挙動を確認しましょう。
Python
for i in [1, 2, 3]:
if i == 99:
break
else:
print('break しなかった')
# 出力: break しなかった上のコードは 99 が無いので break が呼ばれず、else ブロックが実行されます。逆に if i == 2: break のようにしたときは else が スキップ されます。「線形探索で見つからなかったときに else で何かする」という用途が典型的です。
for-else の else は while-else でも同じ意味で使えます。
線形探索を書いてみる
リストの中に目的の値があるかどうかを調べ、見つかれば 'found'、見つからなければ 'not found' を返す関数を書きます。break でループを早期離脱し、else で「最後まで走った場合」を捌くことで、フラグ変数を使わずに綺麗に書けます。
Python
def search_value(items, target):
for v in items:
if v == target:
return 'found'
return 'not found'まずは素直に書くと上のようになりますが、for-else を使うと次のように書き換えられます。意味は同じですが、ループの「最後まで走り切ったか」という事実を else がはっきり示してくれます。
Python
def search_value(items, target):
for v in items:
if v == target:
return 'found'
else:
return 'not found'for と else は同じインデント深さで並べます。else を for の本体側に書かないよう注意してください。
動きを追ってみる
items = [10, 20, 30] で target = 20 のときの流れは次の通りです。
v == target になった瞬間に return で関数を抜けるので、else 句は実行されません。逆に最後まで一致が無ければ else 句に流れ込み、not found が返ります。
よくある間違い
for-else でつまずきやすい点は次の通りです。
elseをifのelseと勘違いして「ループが空のとき」と思い込む- インデントを間違えて
elseをforの本体に入れてしまう breakを書かずにelseの意味を見失う- 早期
returnとelseを混ぜすぎて読みにくくなる else句に大量のロジックを詰め込んでしまう
Python
# NG: else が for ではなく内側の if に紐付いてしまう
for v in items:
if v == target:
return 'found'
else:
return 'not found' # 初回でいきなり not foundこの書き方だと、else が if 文 に対応してしまい、ループ 1 周目で v != target のときに即 not found が返ってしまいます。for-else の else は for と同じインデント に揃えるのが鉄則です。
for-else は便利だが多用すると読みづらくなる。ここぞというときに使う技として温存しよう。
やってみよう
このレッスンの課題は、整数のリスト items と整数 target を受け取り、target が items に含まれていれば文字列 'found'、含まれていなければ 'not found' を返す関数 search_value(items, target) を実装することです。for-else 構文を使うと、フラグ変数なしでスッキリ書けます。for と else のインデントを揃えるのを忘れずに。
余裕があれば、
returnを使わずにresult変数に値を入れて最後に返す形でも書いてみてください。
よくある質問
Q. このトピックは Python 以外の言語でも同じ書き方ですか?
A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。
Q. 実行してエラーが出た場合の対処は?
A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。
Q. 次のステップで何を学ぶべきですか?
A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。
次のレッスン
次は enumerate でインデックス付きループ で、for 文の else 句を使い、リストに値が見つからなかったときの処理を綺麗に書くパターンを学ぶ を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- for-else 構文 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. for-else 構文 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- for 文を使って items を走査すること
- 見つかった瞬間に return すること
- 見つからない場合は 'not found' を返すこと
入出力例
test-cases.txt
search_value([10,20,30], 20) → "found"
search_value([10,20,30], 99) → "not found"
search_value([], 1) → "not found"
search_value([5,6,7], 5) → "found"
search_value([5,6,7], 7) → "found"