Python

forやwhileでelseを使った場合の動作と目的

else って if と一緒に使うものでしょ?」と思っていませんか?実は Python では、forwhile ループにも else を付けることができます。知らなかった方も多いのではないでしょうか。この記事では、ループの else がどんな動きをするのか、どんな場面で役立つのかを、わかりやすいサンプルコードを使って丁寧に解説します!

ループの else ってどういう意味?

Python loop programming
Python loop programming / Photo by Myburgh Roux via Pexels

Python の forwhile には、else ブロックを追加することができます。ポイントはたった一つです。

ループが「途中で break されずに」正常に終了したとき、else ブロックが実行される

逆に言うと、break でループを抜けた場合は else ブロックは実行されません。この「break されたかどうか」を判定できるのが、ループ else の最大の特徴です。

日常生活に例えると、こんなイメージです。

冷蔵庫の中を全部チェックして、プリンが見つからなかったら「プリンがない!」と報告する。
途中でプリンが見つかったら(break)、そのまま終了して報告はしない。

for ループで else を使ってみよう

基本的な書き方

for i in range(5):
    print(i)
else:
    print("ループが最後まで終わりました")
# 出力結果
0
1
2
3
4
ループが最後まで終わりました

このように、break なしでループが終わると else ブロックが動きます。では、途中で break した場合はどうなるでしょう?

for i in range(5):
    if i == 3:
        print(f"{i} で break します")
        break
    print(i)
else:
    print("ループが最後まで終わりました")
# 出力結果
0
1
2
3 で break します

break が実行されたので、else ブロックは実行されませんでした。この動きがポイントです!

実用例① リストの中から目的の値を探す

最もよく使われるのが「リストの中に特定の値があるかどうか」を調べるケースです。else を使わない場合と比べてみましょう。

else を使わない場合(フラグ変数が必要)

fruits = ["apple", "banana", "grape", "mango"]
target = "grape"

found = False  # フラグ変数が必要
for fruit in fruits:
    if fruit == target:
        print(f"{target} が見つかりました!")
        found = True
        break

if not found:
    print(f"{target} は見つかりませんでした")

「見つかったかどうか」を記録するための found というフラグ変数が必要になり、コードが少し複雑になります。

else を使った場合(スッキリ!)

fruits = ["apple", "banana", "grape", "mango"]
target = "grape"

for fruit in fruits:
    if fruit == target:
        print(f"{target} が見つかりました!")
        break
else:
    print(f"{target} は見つかりませんでした")

フラグ変数が不要になり、コードがグッとスッキリしました。「break されなかった=見つからなかった」という意味が自然に表現できています。

実用例② 素数かどうか判定する

ループ else の代表的な使い道として「素数判定」があります。素数とは、1 と自分自身以外に割り切れる数がない整数のことです。

def is_prime(n):
    if n < 2:
        return False
    for i in range(2, n):
        if n % i == 0:
            print(f"{n} は {i} で割り切れるので素数ではありません")
            break
    else:
        # ループが最後まで終わった = 割り切れる数がなかった = 素数!
        print(f"{n} は素数です")
        return True
    return False

is_prime(7)
is_prime(10)
# 出力結果
7 は素数です
10 は 2 で割り切れるので素数ではありません

割り切れる数が一つも見つからずにループが終了した場合=素数、と非常に直感的に書けます。

while ループでも else は使える

for だけでなく、while にも同じように else を付けることができます。動きは同じで「break されずにループが終了したときに実行」されます。

count = 0
max_try = 5
secret = 3  # 正解の数字

while count < max_try:
    guess = int(input(f"数字を当ててください(残り {max_try - count} 回): "))
    if guess == secret:
        print("正解です!おめでとう!")
        break
    count += 1
else:
    # max_try 回試みて break されなかった = 全部外れ
    print(f"{max_try} 回外れました。正解は {secret} でした。")

数字当てゲームの例です。制限回数以内に正解すれば break で抜け、else は実行されません。回数を使い切った場合のみ「正解は〇〇でした」と表示されます。ゲームのような「試行回数を使い果たした場合の処理」を書くのにとても向いています。

注意点:else の位置に気をつけよう

ループの else を使うときに気をつけてほしいのが、インデント(字下げ)の位置です。elseforwhile と同じインデントレベルに書きます。

# ✅ 正しい書き方
for i in range(3):
    print(i)
else:           # for と同じ位置
    print("完了")

# ❌ よくある間違い(else が if と対応しているように見えてしまう)
for i in range(3):
    if i == 1:
        print("1 を発見")
    else:       # これは for ではなく if の else!
        print(i)

特に for の中に if がある場合、else がどちらに対応しているか混乱しやすいので注意しましょう。

まとめ:ループの else を使いこなそう

最後に、ループの else の動きと使いどころを表にまとめます。

状況else ブロックは実行される?
ループが最後まで正常に終了した✅ 実行される
break でループを抜けた❌ 実行されない
continue を使った(break なし)✅ 実行される
ループの対象が空(空リストなど)✅ 実行される

ループ else が向いているケース

  • リストの中から特定の値を探す処理(見つからなかったときの処理を書く)
  • 素数判定など「一度も条件に合わなかった」ことを検知したいとき
  • 数字当てゲームなど「試行回数を使い果たした」ことを検知したいとき
  • フラグ変数を使わずにコードをスッキリさせたいとき

elseif と使うもの」という固定観念を外して、ループにも使えると覚えておくだけでコードの可読性がぐっと上がります。最初は「なんか不思議」と感じるかもしれませんが、使ってみると「あ、便利!」と思える場面が必ず出てきますよ。ぜひ自分のコードに取り入れてみてください!

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

もしも

Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

FastAPIでWebAPI開発を実践的に学ぶ

Amazonで見る
ESP32&Arduino 電子工作 プログラミング入門

もしも

ESP32&Arduino 電子工作 プログラミング入門

ESP32とArduinoで電子工作を学ぶ入門書

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です