Python for-else ループ
Python では、forループには、elseelse 句を付けることができます。これは Python 特有の文法であり、他のほとんどのプログラミング言語とは異なります。
for-else構造の説明:ループが正常に完了した場合(つまり、breakbreak で中断されなかった場合)には、elseelse 内のコードが実行されます。
単語の意味: else「その他」という意味で、ここでは「ループが正常に終了した後の処理」を表します。
基本構文とパラメータ
構文形式
for 变量 in 可迭代对象:
循环体
else:
循环正常结束时的处理
実行ロジック
- 正常完了:ループがすべての要素を走査し終えた後、else 句を実行します。
- break で終了:ループが break で中断された場合は、else 句は実行されません。
- 異常終了:ループ内で例外が発生した場合、else も実行されません。
例
例1:基本的な使い方 - 検索失敗時に実行
例
# リスト内の偶数を探し、見つかれば出力し、見つからなければ else を実行
numbers = [1, 3, 5, 7, 9]
for num in numbers:
if num % 2 == 0:
print(f"偶数を見つけました: {num}")
break
else:
print("偶数が見つかりませんでした")
print("---")
# リストに偶数が含まれる場合
numbers = [1, 3, 6, 7, 9]
for num in numbers:
if num % 2 == 0:
print(f"偶数を見つけました: {num}")
break
else:
print("偶数が見つかりませんでした")
numbers = [1, 3, 5, 7, 9]
for num in numbers:
if num % 2 == 0:
print(f"偶数を見つけました: {num}")
break
else:
print("偶数が見つかりませんでした")
print("---")
# リストに偶数が含まれる場合
numbers = [1, 3, 6, 7, 9]
for num in numbers:
if num % 2 == 0:
print(f"偶数を見つけました: {num}")
break
else:
print("偶数が見つかりませんでした")
期待される実行結果:
未找到偶数 --- 找到偶数: 6
コードの解説:
- 最初の例:リスト全体を走査し終えたため(break を実行していない)、else を実行します。
- 2つ目の例:偶数を見つけた後に break を実行するため、else をスキップします。
例2:よくある応用 - 素数を探す
例
# ある数が素数かどうかを判定する
def is_prime(n):
if n <= 1:
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(7) # 出力: 7 は素数
is_prime(10) # 出力: 10 は素数ではなく、2 で割り切れます
def is_prime(n):
if n <= 1:
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(7) # 出力: 7 は素数
is_prime(10) # 出力: 10 は素数ではなく、2 で割り切れます
期待される実行結果:
7 是质数 10 不是质数,能被 2 整除
これは for-else の最も古典的な使い方の1つです。検索の走査が完了した後、対象が見つからなければ else を実行します。
例3:break との比較
例
# シナリオ:リストを走査して特定の要素を探す
fruits = ["apple", "banana", "orange", "grape"]
# for-else を使用
print("=== for-else を使用 ===")
for fruit in fruits:
if fruit == "orange":
print(f"見つかりました: {fruit}")
break
print(f"確認: {fruit}")
else:
print("対象が見つかりません")
print("\n=== break を使用しない ===)
# もう1つの書き方(else を使用しない)
found = False
for fruit in fruits:
if fruit == "orange":
print(f"見つかりました: {fruit}")
found = True
break
print(f"確認: {fruit}")
if not found:
print("対象が見つかりません")
fruits = ["apple", "banana", "orange", "grape"]
# for-else を使用
print("=== for-else を使用 ===")
for fruit in fruits:
if fruit == "orange":
print(f"見つかりました: {fruit}")
break
print(f"確認: {fruit}")
else:
print("対象が見つかりません")
print("\n=== break を使用しない ===)
# もう1つの書き方(else を使用しない)
found = False
for fruit in fruits:
if fruit == "orange":
print(f"見つかりました: {fruit}")
found = True
break
print(f"確認: {fruit}")
if not found:
print("対象が見つかりません")
期待される実行結果:
=== 使用 for-else === 检查: apple 检查: banana 找到: orange === 不使用 else === 检查: apple 检查: banana 找到: orange
for-else 構文はより簡潔で、追加のフラグ変数が不要です。
例4:ループ終了の処理
例
# シナリオ:すべての要素が条件を満たすかどうかを検証する
scores = [85, 90, 78, 92, 88]
# 不合格があるか確認する
print("=== 不合格があるか確認 ===")
for score in scores:
if score < 60:
print(f"不合格を発見: {score}")
break
print(f"{score} 点、合格")
else:
print("すべての成績が合格です")
# もう1つのシナリオ:すべての処理を完了した後にクリーンアップを実行する
print("\n=== 処理完了後のクリーンアップ ===)
files = ["a.txt", "b.txt", "c.txt"]
for file in files:
print(f"ファイルを処理中: {file}")
else:
print(すべてのファイルの処理が完了しました。クリーンアップを実行します)
print("--- クリーンアップ完了 ---")
scores = [85, 90, 78, 92, 88]
# 不合格があるか確認する
print("=== 不合格があるか確認 ===")
for score in scores:
if score < 60:
print(f"不合格を発見: {score}")
break
print(f"{score} 点、合格")
else:
print("すべての成績が合格です")
# もう1つのシナリオ:すべての処理を完了した後にクリーンアップを実行する
print("\n=== 処理完了後のクリーンアップ ===)
files = ["a.txt", "b.txt", "c.txt"]
for file in files:
print(f"ファイルを処理中: {file}")
else:
print(すべてのファイルの処理が完了しました。クリーンアップを実行します)
print("--- クリーンアップ完了 ---")
期待される実行結果:
=== 检查是否有不及格 === 85 分,合格 90 分,合格 78 分,合格 92 分,合格 88 分,合格 所有成绩都及格 === 处理完成后清理 === 处理文件: a.txt 处理文件: b.txt 处理文件: c.txt 所有文件处理完成,执行清理工作 --- 清理完成 ---
for-else は「完了後にクリーンアップを実行する」シナリオにも使用できます。
例5:実践的な応用 - ログイン検証
例
# ログイン試行をシミュレートする
def try_login(username, password):
valid_users = {
"admin": "123456",
"user": "password",
"guest": "guest"
}
print(f"ログイン試行: {username}")
for user, pwd in valid_users.items():
if user == username and pwd == password:
print("ログイン成功!")
return True
else:
# すべてのユーザーを走査しても一致しなかった場合
print("ユーザー名またはパスワードが間違っています")
return False
# テスト
try_login("admin", "123456") # 出力: ログイン成功
print("---")
try_login("admin", "wrong") # 出力: ユーザー名またはパスワードが間違っています
def try_login(username, password):
valid_users = {
"admin": "123456",
"user": "password",
"guest": "guest"
}
print(f"ログイン試行: {username}")
for user, pwd in valid_users.items():
if user == username and pwd == password:
print("ログイン成功!")
return True
else:
# すべてのユーザーを走査しても一致しなかった場合
print("ユーザー名またはパスワードが間違っています")
return False
# テスト
try_login("admin", "123456") # 出力: ログイン成功
print("---")
try_login("admin", "wrong") # 出力: ユーザー名またはパスワードが間違っています
期待される実行結果:
尝试登录: admin 登录成功! --- 尝试登录: admin 用户名或密码错误
for-else は走査・検索のシナリオで非常に役立ち、「見つからなかった」というロジックを明確に表現できます。
注意事項
elseではなくifの一部であり、むしろforの一部です。- を混同して使用
elseとifしないでください。 - この構文は Python 特有であり、他の言語にはありません。
その他の拡張
Python3 ループ文