Pythonで繰り返し処理といえばfor
文。
でも、そのあとにelse
を付けられるって知っていましたか?
for item in items:
if 条件:
break
else:
print("すべてチェックしました")
このように、Pythonではfor文とelse文を組み合わせて使うことができます。
「breakしたらelseは実行されない」「最後までループしたらelseが実行される」など、他の言語にはないユニークな仕様があるため、初心者のうちは混乱しがちです。
しかし、正しく使えばコードを分かりやすく整理できる強力な構文でもあります。
この記事では、「for-else構文とは何か?」という基礎から、具体例、使いどころ、注意点まで分かりやすく解説します!
for-else構文とは?基本の仕組み

for-elseの基本構文
for 要素 in シーケンス:
# 繰り返し処理
if 条件:
break
else:
# breakされずに最後までループしたときに実行される
重要なポイント
else
はループが正常終了(途中でbreakされなかった)時に実行されるbreak
されたらelse
はスキップされるcontinue
ではelse
はスキップされない
動作の流れ
- forループが開始される
- 各要素に対して処理を実行
- breakが実行された場合:elseをスキップして終了
- breakなしで最後まで実行された場合:elseの処理を実行
ポイント: for-else
は「breakしなかったときにだけ処理を実行したい」というときに便利な構文です。
for-elseの実践的な使用例
例① リスト内に特定の値が存在するかチェック
for-elseを使った場合:
names = ["Alice", "Bob", "Charlie"]
for name in names:
if name == "David":
print("Davidが見つかりました")
break
else:
print("Davidはいませんでした")
出力: Davidはいませんでした
従来の書き方との比較:
# フラグを使った従来の書き方
names = ["Alice", "Bob", "Charlie"]
found = False
for name in names:
if name == "David":
print("Davidが見つかりました")
found = True
break
if not found:
print("Davidはいませんでした")
for-elseを使うと、フラグ変数が不要になり、コードがスッキリします。
例② 素数判定(割り切れる数がなければ素数)
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
print(f"{n} は素数ではありません({i}で割り切れます)")
return False
else:
print(f"{n} は素数です")
return True
# 使用例
is_prime(17) # 17 は素数です
is_prime(15) # 15 は素数ではありません(3で割り切れます)
解説: 割り切れる数が見つかったらbreakで終了、それがなければelseで「素数」と判定
例③ パスワード強度チェック
def check_password_strength(password):
weak_patterns = ["123", "abc", "password", "admin"]
for pattern in weak_patterns:
if pattern in password.lower():
print(f"危険:'{pattern}'が含まれています")
return False
else:
print("パスワードは安全です")
return True
# 使用例
check_password_strength("mypassword123") # 危険:'password'が含まれています
check_password_strength("SecurePass2024") # パスワードは安全です
ポイント: 「条件に1つでも一致すれば終了、それ以外は最後まで処理」という場面でfor-elseは非常にスマートに書けます。
for-elseでハマりやすいポイントと注意点

注意① elseの位置に気をつけよう
間違った例:
for item in items:
if 条件:
break
else: # ← これはifのelse!
print("これはfor-elseではありません")
正しい例:
for item in items:
if 条件:
break
else: # ← これがfor-else
print("これがfor-elseです")
見分け方: for文と同じレベルのインデントにあるelseがfor-elseです。
注意② continueとbreakの違い
# continueの場合
numbers = [1, 2, 3, 4, 5]
for num in numbers:
if num == 3:
continue # 3をスキップするだけ
print(num)
else:
print("ループが完了しました") # ← これは実行される
# 出力:
# 1
# 2
# 4
# 5
# ループが完了しました
# breakの場合
numbers = [1, 2, 3, 4, 5]
for num in numbers:
if num == 3:
break # ループを完全に終了
print(num)
else:
print("ループが完了しました") # ← これは実行されない
# 出力:
# 1
# 2
重要: continue
はループを続行するのでelse
は実行されますが、break
はループを終了するのでelse
は実行されません。
注意③ while-elseも存在する
count = 0
target = 5
while count < 3:
if count == target:
print("目標値に到達しました")
break
count += 1
else:
print("目標値に到達できませんでした")
# 出力:目標値に到達できませんでした
ポイント: while-else
もPythonの正式な構文です。動作原理はfor-elseと同じです。
for-elseを使うべきタイミングと使わない方が良い場面
for-elseが適している場面
場面 | 説明 | 例 |
---|---|---|
検索処理 | リストから特定の要素を探す | ユーザー名の重複チェック |
検証処理 | すべての要素が条件を満たすかチェック | データの妥当性確認 |
条件付き終了 | 特定条件で処理を中断したい | エラー検出時の処理停止 |
使わない方が良い場面
場面 | 理由 | 代替案 |
---|---|---|
breakが入らないループ | for-elseの意味がない | 通常のforループを使用 |
複雑なロジック | 可読性が下がる | フラグ変数や関数分割 |
チームでの開発 | 他の人が理解しにくい可能性 | より明示的な書き方を検討 |
実践的な判断基準
使うべき場合:
# 良い例:検索処理が明確
for user in users:
if user.name == target_name:
print(f"ユーザー {target_name} が見つかりました")
break
else:
print(f"ユーザー {target_name} は存在しません")
使わない方が良い場合:
# 悪い例:複雑すぎて分かりにくい
for item in complex_data:
result = complex_calculation(item)
if complex_condition(result):
complex_processing(result)
if another_condition():
break
else:
# この時点で何が起こっているか分からない
final_processing()
ポイント: for-elseは適材適所で使えばコードを美しくできるけれど、使いすぎは禁物。状況に応じた判断が大切です。
よくある質問

Q: for-elseは他のプログラミング言語にもありますか?
A: いいえ、for-else構文はPython特有の機能です。C++、Java、JavaScriptなどには存在しません。
Q: なぜPythonにはfor-elseがあるのですか?
A: 「検索処理で見つからなかった場合の処理」を簡潔に書けるようにするためです。フラグ変数を使わずに済むので、コードがすっきりします。
Q: for-elseを使うとプログラムが速くなりますか?
A: 実行速度にはほとんど影響ありません。主な利点はコードの可読性と簡潔性です。
実践練習問題
練習問題1:完全数の判定
完全数(自分自身を除く約数の和が自分自身と等しい数)を判定する関数をfor-elseで書いてみましょう。
解答例:
def is_perfect_number(n):
if n <= 1:
return False
divisor_sum = 0
for i in range(1, n):
if n % i == 0:
divisor_sum += i
return divisor_sum == n
# テスト
print(is_perfect_number(6)) # True(1+2+3=6)
print(is_perfect_number(28)) # True(1+2+4+7+14=28)
print(is_perfect_number(12)) # False
練習問題2:配列の要素がすべて正の数かチェック
def all_positive(numbers):
for num in numbers:
if num <= 0:
print(f"負の数または0が見つかりました: {num}")
return False
else:
print("すべての数が正の数です")
return True
# テスト
all_positive([1, 2, 3, 4, 5]) # すべての数が正の数です
all_positive([1, 2, -3, 4, 5]) # 負の数または0が見つかりました: -3
まとめ:Pythonのfor-else構文を使いこなそう!
今回学んだポイント:
for-else
は、ループが「breakされなかった」場合だけ処理を実行する特別な構文- データ探索や条件検証など、「なかったとき」の処理に最適
- インデント・誤解・使いどころには注意が必要
実際に使ってみよう:
- 簡単な検索処理から始めてみる
- 既存のフラグ変数をfor-elseで置き換えてみる
- チームメンバーと共有して理解を深める
コメント