猿问

Python while语句上的OSE子句

Python while语句上的OSE子句

我注意到以下代码在Python中是合法的。我的问题是为什么?有什么具体的原因吗?

n = 5while n != 0:
    print n
    n -= 1else:
    print "what the..."


慕森卡
浏览 394回答 3
3回答

白板的微信

这个else子句只在while条件变假了。如果你break在循环之外,或者如果引发异常,它将不会被执行。考虑这个问题的一种方法是,作为一个关于条件的if/etc结构:if&nbsp;condition: &nbsp;&nbsp;&nbsp;&nbsp;handle_true()else: &nbsp;&nbsp;&nbsp;&nbsp;handle_false()类似于循环结构:while&nbsp;condition: &nbsp;&nbsp;&nbsp;&nbsp;handle_true()else: &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;condition&nbsp;is&nbsp;false&nbsp;now,&nbsp;handle&nbsp;and&nbsp;go&nbsp;on&nbsp;with&nbsp;the&nbsp;rest&nbsp;of&nbsp;the&nbsp;program &nbsp;&nbsp;&nbsp;&nbsp;handle_false()例如:while&nbsp;value&nbsp;<&nbsp;threshold: &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;process_acceptable_value(value): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;something&nbsp;went&nbsp;wrong,&nbsp;exit&nbsp;the&nbsp;loop;&nbsp;don't&nbsp;pass&nbsp;go,&nbsp;don't&nbsp;collect&nbsp;200 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break &nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;update(value)else: &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;value&nbsp;>=&nbsp;threshold;&nbsp;pass&nbsp;go,&nbsp;collect&nbsp;200 &nbsp;&nbsp;&nbsp;&nbsp;handle_threshold_reached()

人到中年有点甜

这个else如果您正常退出块,则执行子句,方法是按下循环条件或从TRY块底部掉下来。它是不如果你break或return或引发异常。它不仅适用于时间和循环,还可以尝试块。您通常会在通常会提前退出循环的地方找到它,并且在循环结束时运行是一个意外/不寻常的场合。例如,如果您正在遍历一个寻找值的列表:for&nbsp;value&nbsp;in&nbsp;values: &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;value&nbsp;==&nbsp;5: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"Found&nbsp;it!" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breakelse: &nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"Nowhere&nbsp;to&nbsp;be&nbsp;found.&nbsp;:-("

Smart猫小萌

答复Is there a specific reason?,这里有一个有趣的应用程序:突破多个级别的循环。下面是它的工作原理:外部循环在结束时有一个中断,所以它只能执行一次。但是,如果内部循环完成(发现没有除数),那么它将到达OSE语句,并且永远不会到达外部中断。这样,内部循环中的中断就会从两个循环中分离出来,而不仅仅是一个循环。for&nbsp;k&nbsp;in&nbsp;[2,&nbsp;3,&nbsp;5,&nbsp;7,&nbsp;11,&nbsp;13,&nbsp;17,&nbsp;25]: &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;m&nbsp;in&nbsp;range(2,&nbsp;10): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;k&nbsp;==&nbsp;m: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'trying&nbsp;%s&nbsp;%%&nbsp;%s'&nbsp;%&nbsp;(k,&nbsp;m) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;k&nbsp;%&nbsp;m&nbsp;==&nbsp;0: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'found&nbsp;a&nbsp;divisor:&nbsp;%d&nbsp;%%&nbsp;%d;&nbsp;breaking&nbsp;out&nbsp;of&nbsp;loop'&nbsp;%&nbsp;(k,&nbsp;m) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break &nbsp;&nbsp;&nbsp;&nbsp;else: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue &nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'breaking&nbsp;another&nbsp;level&nbsp;of&nbsp;loop' &nbsp;&nbsp;&nbsp;&nbsp;breakelse: &nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'no&nbsp;divisor&nbsp;could&nbsp;be&nbsp;found!'对两个人来说while和for循环else语句在末尾执行,除非break被利用了。在大多数情况下,有更好的方法来做到这一点(将其包装成函数或引发异常),但这是有效的!
随时随地看视频慕课网APP

相关分类

Python
我要回答