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

时间:2013-05-28 22:54:11

标签: python while-loop flow

我对编程和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

有更好的方法吗?

3 个答案:

答案 0 :(得分:8)

您正在寻找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 

来自docs:

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

第一个套件中执行的break语句终止循环   没有执行else子句的套件。

答案 1 :(得分:3)

else循环使用while子句:

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

请参阅while statement documentation

  

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

答案 2 :(得分:0)

如果你考虑一下,你可能已经有了一个非常好的条件,可以在不设置标志的情况下使用: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 / else案例相同,这并不意味着对条件的任何进一步测试都不会发生。如果真正的分支使if a为假,则附加到a的{​​{1}}将无法运行,与else相关联的while将会从不在break之后运行,因为它明确地跳过再次检查条件。这使得else:在每种情况下都相当于一个带标记的标记。

这也延伸到for循环,即使类比中断 - 但它在相似的足够规则下执行:如果循环结束时运行else而不是命中{break {1}}。