识别回路中的多个出口点

2024-09-30 16:20:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在看pythonlecture by Raymond Hettinger on youtube。他给我们展示了正确的出路:

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

我不明白为什么要为else语句而烦恼,而不仅仅是:

^{pr2}$

我是不是遗漏了什么,或者只是出于某种原因偶尔添加这个else/break语句?


Tags: targetbyreturnyoutubevalueondef语句
2条回答

简明回答:一旦使用return,您将无法使用您的函数。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")

或写入文件:

^{pr2}$

进一步发展(@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")

所以为了这个小小的目的,这是没有必要的。但是,如果您要在此基础上构建一些东西,else子句可能会有用。在

我觉得这个例子太短了,“为什么要麻烦?”在这种情况下,这个问题完全合乎逻辑。在

然而,如果要进一步处理发现的值,差异将变得明显(但也需要更多的呈现时间)

Python道:

def find1(seq, target):
    for i, value in enumerate(seq):
        if value == target:
            break
    else:
        return -1
    i = some_preprocessing(i)
    func(i)
    i = final_adjustment(i)
    logging_result(i)
    return i

如果没有else-处理代码将出现在搜索循环中。代码也向右缩进了很多。在

^{pr2}$

另外,使用标志的代码(Hettinger先生开始使用的例子)也不如:

def find2(seq, target):
    found = False
    for i, value in enumerate(seq):
        if value == target:
            found = True
            break
    if not found:
        return -1
    i = some_preprocessing(i)
    func(i)
    i = final_adjustment(i)
    logging_result(i)
    return i

相关问题 更多 >