美文网首页
Effective Python(12): 不要在for和whi

Effective Python(12): 不要在for和whi

作者: warmsirius | 来源:发表于2019-10-11 22:47 被阅读0次

一、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之外,是否没有其他的公约数):

  • 把所有可能的公约数的每个值都遍历一轮,逐个判断两数是否能以该值为公约数。
  • 尝试完每一种可能的值之后,循环就结束了
  • 如果两个数确实互质,那么在执行循环过程中,程序就不会因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有种特殊语法,可在forwhile循环的内部语句块之后紧跟一个else
  • 只有当整个循环主体都没遇到break语句时,循环后面的else块才会执行
  • 不要在循环后面使用else块,因为这种写法既不直观,又容易引人误解

相关文章

网友评论

      本文标题:Effective Python(12): 不要在for和whi

      本文链接:https://www.haomeiwen.com/subject/nhffmctx.html