3

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

有没有更好的办法?

4

3 回答 3

9

您正在寻找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子句的套件。

于 2013-05-28T22:55:25.390 回答
3

在循环中使用else子句:while

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

请参阅while声明文档

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

于 2013-05-28T22:55:41.423 回答
0

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

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

while如果您将其视为重复,这是有道理的if:不是发生一次,而是持续一段时间,直到条件变得虚假。

但是,就像其他答案提到的那样,类比更进一步:就像您不必将所有ifs 拼写为

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

whileelse如果测试顶部的条件并发现它是错误的,则接受执行。所以,

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

而且,与if/else情况相同,这并不意味着对条件进行任何进一步的测试,而不是无论如何都会发生的情况。与如果真分支为假,则附加else到不会运行的方式相同,附加到 a将永远不会在 a 之后运行,因为它明确跳过再次检查条件。这使得在每种情况下都相当于一个decicated flag。if aaelsewhilebreakelse:

这也延伸到for循环,即使类比中断了——但它在足够相似的规则下执行:else如果循环以运行其进程而不是命中 a 结束,则运行break

于 2013-05-28T23:04:39.383 回答