美文网首页
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