繁体   English   中英

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

[英]Flow control after breaking out of while loop in Python

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

来自docs:

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 s一样

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

while接受一个else如果在顶部进行条件测试,发现为falsey时执行。 所以,

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

并且,与if / else情况相同,这并不意味着对条件的任何进一步测试都不会发生。 在一个同样的方式else连接到if a如果真分支使得将不会运行a falsey,一个else连接到while会后就再也没有运行break ,因为这明确地跳过以后再检查的条件。 这使得else:在每种情况下else:相当于一个decicated标志。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM