我对编程和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 a
的else
在 true-branch 使a
为假时不会运行一样,附加到while
的else
在break
之后永远不会运行,因为它明确跳过再次检查条件。这使得else:
在每种情况下都等同于一个被剔除的标志。
这也扩展到for
循环,即使类比中断 - 但它在类似的规则下执行:如果循环以运行其路线而不是达到break
结束,则运行else
。