循环 else 子句
Python 的 for 和 while 循环可以带一个 else 子句。这个设计在 C、Java 等语言中不存在,是 Python 独有的特性。它的语义很精确:只有当循环正常结束(没有被 break 打断)时,else 才执行。
基本语法
for i in range(5):
print i
else:
print "Loop finished normally"
# 输出:
# 0
# 1
# 2
# 3
# 4
# Loop finished normally
i = 0
while i < 5:
print i
i += 1
else:
print "Loop finished normally"
# 输出同上
与 break 的配合
else 的核心价值在于与 break 配合,区分"正常结束"和"提前退出":
# 搜索列表中的素数
nums = [4, 6, 8, 9, 10]
for n in nums:
if n % 2 != 0:
print "Found odd number:", n
break
else:
print "No odd number found" # 执行,因为没有 break
# 输出:No odd number found
nums = [4, 6, 7, 8, 10]
for n in nums:
if n % 2 != 0:
print "Found odd number:", n
break
else:
print "No odd number found" # 不执行,因为 break 了
# 输出:Found odd number: 7
实际应用场景
场景 1:验证列表是否满足条件
# 检查是否所有分数都及格
scores = [85, 90, 78, 92]
for score in scores:
if score < 60:
print "Someone failed"
break
else:
print "All passed" # 执行
场景 2:查找质数
# 检查 n 是否为质数
n = 17
for i in range(2, n):
if n % i == 0:
print n, "is not prime"
break
else:
print n, "is prime" # 执行,因为 17 不能被 2~16 整除
这个算法虽然简单(没有优化到 sqrt(n)),但展示了 else 的清晰语义:如果循环遍历了所有可能的因子都没有找到能整除的,那么 else 执行,确认是质数。
场景 3:用户输入验证
attempts = 3
while attempts > 0:
password = raw_input("Enter password: ")
if password == "secret":
print "Access granted"
break
print "Wrong password,", attempts - 1, "attempts left"
attempts -= 1
else:
print "Access denied" # 3 次都错了才执行
常见误解
初学者常把循环 else 理解为"条件不满足时执行",这是错误的。它只与 break 有关:
# 错误理解:以为 i == 3 时执行 else
for i in range(5):
if i == 3:
print "Three"
else:
print "Else" # 始终执行(除非 for 内部有 break)
# 输出:
# Three
# Else
如果循环内部没有 break,else 总是执行,这时它没有任何特殊作用,反而让代码显得奇怪。
与标志变量的对比
不用 else,可以用标志变量实现相同逻辑:
# 用标志变量
found = False
for n in nums:
if n % 2 != 0:
found = True
print "Found odd number:", n
break
if not found:
print "No odd number found"
# 用 else(更简洁)
for n in nums:
if n % 2 != 0:
print "Found odd number:", n
break
else:
print "No odd number found"
else 版本避免了额外的标志变量,把"搜索失败"的逻辑直接绑定在循环结构上。但这也增加了理解成本——不熟悉 Python 的程序员可能看不懂 else 的含义。
使用建议
- 循环中有
break时,else可以简化代码 - 循环中没有
break时,不要用else,它只会让人困惑 - 如果团队不熟悉 Python 的
else语义,用标志变量更稳妥