我对编程和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
有更好的方法吗?
答案 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}}。