Contents
30.1.9. 不要在for与while循环后面写else块¶
for/else结构里的else也是这个意思,即如果循环没有从头到尾执行完,那就执行else块。实际上恰恰相反,如果循环没有从头到尾执行完(也就是循环提前终止了),那么else块里的代码是不会执行的。
In [2]: for i in range(3):
...: print("Loop",i)
...: else:
...: print("Else block")
...:
Loop 0
Loop 1
Loop 2
Else block
In [3]: for i in range(3):
...: print("Loop",i)
...: if i == 1:
...: break
...: else:
...: print("Else block")
...:
...:
Loop 0
Loop 1
如果对空白序列做for循环,那么程序立刻就会执行else块。
In [4]: for x in []:
...: print("Never runs")
...: else:
...: print("for Else block")
...:
for Else block
while循环也是这样,如果首次循环就遇到False,那么程序也会立刻运行else块。
In [6]: while False:
...: print("Never runs")
...: else:
...: print("for Else block")
...:
...:
for Else block
例如,如果要判断两个数是否互质(也就是除了1之外,是不是没有别的数能够同时整除它们),就可以用这种结构实现,改用辅助函数完成计算.
用变量来记录循环过程中有没有碰到这样的情况,如果有,那就用break提前跳出循环,如果没有,循环就会完整地执行,无论如何,最后都返回这个变量的值。
In [8]: def coprime_alternate(a,b):
...: is_coprime = True
...: for i in range(2,min(a,b)+1):
...: if a % 1 == 0 or b % 1==0:
...: is_coprime = False
...: break
...: return is_coprime
因为for与while循环这种简单的结构,在Python里面读起来应该相当明了才对,如果把else块紧跟在它的后面,那就会让代码产生歧义。所以,请不要这么写。
要点:
Python有种特殊的语法,可以把else块紧跟在整个for循环或while循环的后面。
只有在整个循环没有因为break提前跳出的情况下,else块才会执行。
把else块紧跟在整个循环后面,会让人不太容易看出这段代码的意思,所以要避免这样写。