区分循环中的多个退出点

use*_*277 10 python loops

在youtube上观看Raymond Hettinger的 python 讲座.他展示了退出循环的正确方法:

def find(seq, target):
    for i, value in enumerate(seq):
        if value == target:
            break
    else:
        return -1
    return i
Run Code Online (Sandbox Code Playgroud)

我不明白为什么要烦恼其他声明,而不仅仅是:

def find(seq, target):
    for i, value in enumerate(seq):
        if value == target:
            return i
    return -1
Run Code Online (Sandbox Code Playgroud)

我是否遗漏了某些内容,或者出于某种原因有时添加其他/ break语句也是个好主意?

Ant*_*vBR 6

简明回答:一旦你使用了返回,你就失去了功能.Break表示代码继续运行,您可以添加更多内容.所以你在你的例子中是正确的,但是如果你想要做更多的事情,如果没有发现什么怎么办:

提出错误:

def find(seq, target):
    for i, value in enumerate(seq):
        if value == target:
            break
    else:
        raise ValueError("Nothing found in {}".format(seq))
    return i


find("hello","a")
Run Code Online (Sandbox Code Playgroud)

或写入文件:

def find(seq, target):
    for i, value in enumerate(seq):
        if value == target:
            break
    else:
        with open("output.txt", "w") as f:
            f.write("Nothing found :(((")
    return i


find("hello","a")
Run Code Online (Sandbox Code Playgroud)

进一步发展(@Joe Iddon):

你可能还想继续下去:

def find(seq, target):
    for i, value in enumerate(seq):
        if value == target:
            break
    else:
        return "Nothing found"

    # calculate more things
    a = [1,2,3]
    if i in a:
        return i
    else:
        return "Not in a"


find("hello","a")
Run Code Online (Sandbox Code Playgroud)

因此,对于这个小目的,没有必要.但是如果你正在构建一些东西,那么else子句可能很有用.