本文目录导读:

在 Python 中,for...else 和 while...else 是一个非常有特色但容易被忽视的特性。else 块在循环正常结束(没有被 break 中断)时执行。
核心规则
- 循环正常结束 → 执行 else 块
- 循环被
break中断 → 不执行 else 块
实用案例
查找元素(最常见用法)
# 查找列表中是否存在特定元素
numbers = [1, 3, 5, 7, 9, 11]
target = 6
for num in numbers:
if num == target:
print(f"找到目标值: {target}")
break
else:
print(f"列表中不存在目标值: {target}")
# 输出: 列表中不存在目标值: 6
# target = 7,则会输出: 找到目标值: 7(不会执行 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} 整除")
break
else:
print(f"{n} 是质数")
return True
return False
# 测试
is_prime(17) # 输出: 17 是质数
is_prime(15) # 输出: 15 能被 3 整除
验证密码强度
def check_password(password):
# 检查密码是否包含至少一个数字
has_digit = False
for char in password:
if char.isdigit():
has_digit = True
break
else:
print("密码必须包含至少一个数字")
return False
# 检查密码是否包含至少一个字母
for char in password:
if char.isalpha():
has_letter = True
break
else:
print("密码必须包含至少一个字母")
return False
return True
# 测试
check_password("abc123") # 返回 True
check_password("123456") # 输出: 密码必须包含至少一个字母
check_password("abcdef") # 输出: 密码必须包含至少一个数字
循环嵌套中的使用
# 在二维列表中查找目标值
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
target = 5
for row_idx, row in enumerate(matrix):
for col_idx, value in enumerate(row):
if value == target:
print(f"找到 {target} 在位置: ({row_idx}, {col_idx})")
break
else:
continue # 内层循环正常结束(没找到),继续外层循环
break # 内层循环被 break,执行到这里,退出外层循环
else:
print(f"矩阵中不存在 {target}")
数据库连接重试机制
import time
def connect_to_db(max_retries=3):
for attempt in range(1, max_retries + 1):
print(f"第 {attempt} 次尝试连接数据库...")
success = attempt == 3 # 模拟前两次失败,第三次成功
if success:
print("数据库连接成功!")
break
else:
print(f"连接失败,等待重试...")
time.sleep(1)
else:
print("多次尝试连接均失败,请检查网络配置")
return False
return True
# 测试
connect_to_db()
# 输出:
# 第 1 次尝试连接数据库...
# 连接失败,等待重试...
# 第 2 次尝试连接数据库...
# 连接失败,等待重试...
# 第 3 次尝试连接数据库...
# 数据库连接成功!
注意事项
- 不要在 else 块中使用 continue:
continue不会影响 else 的执行
for i in range(5):
if i == 3:
continue # 跳过,不影响 else 执行
else:
print("循环正常结束") # 这会执行
- else 块可以包含任何语句:
return、raise等都可以
def find_value(lst, target):
for item in lst:
if item == target:
return True
else:
raise ValueError(f"{target} 不在列表中")
最佳实践
- 适用于搜索或验证场景:如果找到就
break,否则执行默认操作 - 比使用标记变量更简洁:不需要维护
found = False这样的变量 - 代码意图更清晰:
else明确表示"循环正常结束"的含义
这种模式在处理"查找某个元素并执行相应操作"的场景时特别有用,能让代码更加 Pythonic。