Effective Python(12): 不要在for和whi
2019-10-11 本文已影响0人
warmsirius
一、for循环中使用else
Python提供了一种很多编程语言都不支持的功能,那就是可以在循环内部的语句块后面直接编写else块
Case1:正常的for循环
for i in range(3):
print("Loop %d" % i)
else:
print("Else Block!")
# 输出
Loop 0
Loop 1
Loop 2
Else Block!
else块会在整个循环执行完之后立刻运行。
Case2: 含break的for循环
for i in range(3):
print("Loop %d" % i)
if i == 1:
break
else:
print("Else Block!")
# 输出
Loop 0
Loop 1
在循环里用
break语句提前跳出,会导致程序不执行else块。
Case3: 空列表的for循环
for x in []:
print("Never runs")
else:
print("For Else block!")
# 输出
For Else block!
如果
for循环要遍历的序列是空的,那么会立刻执行else块
二、while循环中使用else
Case1:初始循环条件为while循环
while False:
print("Never runs")
else:
print("While Else block")
# 输出
While Else block
初始循环为
false的while循环,如果后面跟着else块,那么也会立即执行else语块
Case2: 含break的while循环
与for循环一致
三、举例:判断两个数是否互质
1. 伪代码如下
要判断两个数是否互质(也就是判断两者除了1之外,是否没有其他的公约数):
- 把所有可能的公约数的每个值都遍历一轮,逐个判断两数是否能以该值为公约数。
- 尝试完每一种可能的值之后,循环就结束了
- 如果两个数确实互质,那么在执行循环过程中,程序就不会因break语句跳出
2. 代码
a = 4
b = 9
for i in range(2, min(a, b) + 1):
print("Testing", i)
if a % i == 0 and b % i == 0:
print("Not coprime")
break
else:
print("Coprime")
# 输出
Testing 2
Testing 3
Testing 4
Coprime
四、使用场景
实际工作中,完全不推荐这样的写法,因为这样的代码相当费解,而是会用辅助函数来完成计算。
这样的辅助函数,有两种常见的写法:
- 第一种:只要发现受测参数符合自己想要搜寻的条件,就尽早返回
如果整个循环都完整地执行了一遍,那就说明受测参数不符合条件,于是返回默认值。
def coprime(a, b):
for i in range(2, min(a, b)):
if a % i == 0 and b % i == 0:
return False
return True
- 第二种:用变量来记录受测参数是否符合自己想要的搜寻条件
一旦符合,就用break跳出循环。
def coprime2(a, b):
is_coprime = True
for i in range(2, min(a, b)):
if a % i == 0 and b % i == 0:
is_coprime = False
return is_coprime
五、总结
- Python有种特殊语法,可在
for及while循环的内部语句块之后紧跟一个else块 - 只有当整个循环主体都没遇到
break语句时,循环后面的else块才会执行 - 不要在循环后面使用
else块,因为这种写法既不直观,又容易引人误解