为了账号安全,请及时绑定邮箱和手机立即绑定

Python while语句上的OSE子句

Python while语句上的OSE子句

慕森卡 2019-07-11 16:31:38
Python while语句上的OSE子句我注意到以下代码在Python中是合法的。我的问题是为什么?有什么具体的原因吗?n = 5while n != 0:     print n     n -= 1else:     print "what the..."
查看完整描述

3 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

这个else子句只在while条件变假了。如果你break在循环之外,或者如果引发异常,它将不会被执行。

考虑这个问题的一种方法是,作为一个关于条件的if/etc结构:

if condition:
    handle_true()else:
    handle_false()

类似于循环结构:

while condition:
    handle_true()else:
    # condition is false now, handle and go on with the rest of the program
    handle_false()

例如:

while value < threshold:
    if not process_acceptable_value(value):
        # something went wrong, exit the loop; don't pass go, don't collect 200
        break
    value = update(value)else:
    # value >= threshold; pass go, collect 200
    handle_threshold_reached()


查看完整回答
反对 回复 2019-07-11
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

这个else如果您正常退出块,则执行子句,方法是按下循环条件或从TRY块底部掉下来。它是如果你breakreturn或引发异常。它不仅适用于时间和循环,还可以尝试块。

您通常会在通常会提前退出循环的地方找到它,并且在循环结束时运行是一个意外/不寻常的场合。例如,如果您正在遍历一个寻找值的列表:

for value in values:
    if value == 5:
        print "Found it!"
        breakelse:
    print "Nowhere to be found. :-("


查看完整回答
反对 回复 2019-07-11
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

答复Is there a specific reason?,这里有一个有趣的应用程序:突破多个级别的循环。

下面是它的工作原理:外部循环在结束时有一个中断,所以它只能执行一次。但是,如果内部循环完成(发现没有除数),那么它将到达OSE语句,并且永远不会到达外部中断。这样,内部循环中的中断就会从两个循环中分离出来,而不仅仅是一个循环。

for k in [2, 3, 5, 7, 11, 13, 17, 25]:
    for m in range(2, 10):
        if k == m:
            continue
        print 'trying %s %% %s' % (k, m)
        if k % m == 0:
            print 'found a divisor: %d %% %d; breaking out of loop' % (k, m)
            break
    else:
        continue
    print 'breaking another level of loop'
    breakelse:
    print 'no divisor could be found!'

对两个人来说whilefor循环else语句在末尾执行,除非break被利用了。

在大多数情况下,有更好的方法来做到这一点(将其包装成函数或引发异常),但这是有效的!


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 393 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信