for-else 構文で break と else を使い分ける

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

for-else 構文で break と else とは

for 文の else 句を使い、リストに値が見つからなかったときの処理を綺麗に書くパターンを学ぶ。本レッスンでは、for-else 構文で break と else の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

for-else 構文で break と else を使い分ける

Python の for 文には他の言語ではあまり見ない便利な仕組みがあります。それが else です。for-else は「ループが最後まで走り切ったとき (途中で break しなかったとき) に実行されるブロック」を表します。本レッスンでは、リストの中に目的の値が含まれているかを調べる処理を題材に、breakelse の合わせ技を学びましょう。

for-else の else は「条件が偽になったら」ではなく「break しなかったら」と読みます。

for-else の構文

for のすぐ後ろに else: を書きます。forbreak で抜けたときは 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 のときの流れは次の通りです。

diagram (will load when visible)

v == target になった瞬間に return で関数を抜けるので、else 句は実行されません。逆に最後まで一致が無ければ else 句に流れ込み、not found が返ります。

よくある間違い

for-else でつまずきやすい点は次の通りです。

  • elseifelse と勘違いして「ループが空のとき」と思い込む
  • インデントを間違えて elsefor の本体に入れてしまう
  • break を書かずに else の意味を見失う
  • 早期 returnelse を混ぜすぎて読みにくくなる
  • else 句に大量のロジックを詰め込んでしまう

Python

# NG: else が for ではなく内側の if に紐付いてしまう for v in items: if v == target: return 'found' else: return 'not found' # 初回でいきなり not found

この書き方だと、elseif に対応してしまい、ループ 1 周目で v != target のときに即 not found が返ってしまいます。for-elseelsefor と同じインデント に揃えるのが鉄則です。

for-else は便利だが多用すると読みづらくなる。ここぞというときに使う技として温存しよう。

やってみよう

このレッスンの課題は、整数のリスト items と整数 target を受け取り、targetitems に含まれていれば文字列 'found'、含まれていなければ 'not found' を返す関数 search_value(items, target) を実装することです。for-else 構文を使うと、フラグ変数なしでスッキリ書けます。forelse のインデントを揃えるのを忘れずに。

余裕があれば、return を使わずに result 変数に値を入れて最後に返す形でも書いてみてください。

よくある質問

Q. このトピックは Python 以外の言語でも同じ書き方ですか?

A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。

Q. 実行してエラーが出た場合の対処は?

A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。

Q. 次のステップで何を学ぶべきですか?

A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。

次のレッスン

次は enumerate でインデックス付きループ で、for 文の else 句を使い、リストに値が見つからなかったときの処理を綺麗に書くパターンを学ぶ を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. for-else 構文 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. for-else 構文 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. for 文を使って items を走査すること
  2. 見つかった瞬間に return すること
  3. 見つからない場合は '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"

ヒント

main.py
main.py
学習モード

メモ

for-else 構文で break と else を使い分ける

⌘S で保存