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: 含breakfor循环

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

初始循环为falsewhile循环,如果后面跟着else块,那么也会立即执行else语块

Case2: 含breakwhile循环

for循环一致

三、举例:判断两个数是否互质

1. 伪代码如下

要判断两个数是否互质(也就是判断两者除了1之外,是否没有其他的公约数):

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

五、总结

上一篇 下一篇

猜你喜欢

热点阅读