在 Python 中突破 while 循环后的流量控制



我对编程和Python都很陌生。现在有几次,我创建了一个感觉像是尴尬的程序流,我想知道我是否遵循了最佳实践。从概念上讲,这就是我想做的:

def pseudocode():
    while some condition is true:
        do some stuff
        if a condition is met:
            break out of the while loop
    now do a thing once, but only if you never broke out of the loop above 

我最终所做的工作,但不知何故感觉不对劲:

def pseudocode():
    while some condition is true:
        do some stuff
        if some condition is met:
            some_condition_met = True
            break out of the while loop
    if some_condition_met is False:
        do a thing

有没有更好的方法?

您正在寻找while-else循环:

def pseudocode():
    while some condition is true:
        do some stuff
        if a condition is met:
            break out of the while loop
    else:
        now do a thing once, but only if you never broke out of the loop above 

从文档中:

while_stmt ::=  "while" expression ":" suite
                ["else" ":" suite]

在第一个套件中执行的 break 语句终止循环 而不执行else子句的套件。

while循环使用 else 子句:

while some_condition:
    do_stuff()
    if a_condition_is_met:
        break
else:
    executed_when_never_broken

请参阅while语句文档:

在第一个套件中执行的 break 语句终止循环而不执行 else 子句的套件。

如果你考虑一下,你可能已经有一个很好的条件来使用,而无需设置标志:while循环顶部的条件(或者更确切地说,它的not(。假设您没有在与break相同的迭代中更改条件的真实性,这将为您提供:

while something:
    do_stuff()
    if something_else:
        break
if not something:
   more_stuff()

如果你把while看作是一个重复的if,这是有道理的:而不是发生一次,一段时间一直持续到条件变得虚假。

但是,就像其他答案提到的一样,类比更进一步:就像你不必把你所有的if都拼写为

if a:
    a_stuff()
if not a:
    b_stuff()

while接受一个else,如果测试顶部的条件并发现为假,则执行该。所以

while something:
    do_stuff()
    if something_else:
       break
else:
    more_stuff()

而且,与if/else的情况相同,这并不意味着对病情进行任何进一步的测试,而不是无论如何都会发生的事情。就像附加到if aelse在 true-branch 使a为假时不会运行一样,附加到whileelsebreak之后永远不会运行,因为它明确跳过再次检查条件。这使得else:在每种情况下都等同于一个被剔除的标志。

这也扩展到for循环,即使类比中断 - 但它在类似的规则下执行:如果循环以运行其路线而不是达到break结束,则运行else

相关内容

  • 没有找到相关文章

最新更新