关于Python while语句的Else子句

Iva*_*van 293 python syntax if-statement while-loop

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

n = 5
while n != 0:
    print n
    n -= 1
else:
    print "what the..."
Run Code Online (Sandbox Code Playgroud)

ars*_*ars 355

else条款仅在while条件变为false 时执行.如果您break不在循环中,或者引发异常,则不会执行该异常.

考虑它的一种方法是作为关于条件的if/else构造:

if condition:
    handle_true()
else:
    handle_false()
Run Code Online (Sandbox Code Playgroud)

类似于循环结构:

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

一个例子可能是:

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()
Run Code Online (Sandbox Code Playgroud)

  • "else子句仅在while条件变为false时执行." 这里的措辞意味着你的while状态从true变为false,而else将被执行.但是,如果while永远不为真,则仍会执行else子句. (37认同)
  • *伪代码*所以,如果我错了,请纠正我,但这与“while {} Something”完全相同,*除了*如果您在“while”循环中“break”,“something”将被跳过。 (2认同)
  • 也许最精确的伪代码是:while(True){if(cond){handle_true(); } else {handle_false(); 打破; }} (2认同)
  • “不走,不收200”,哈哈,每个人都知道这是哪里的 (2认同)

Joh*_*ica 92

else如果您正常退出块,通过按下循环条件或从try块的底部掉落,则执行该子句.如果你或在一个区块之外,它不会被执行,或者引发异常.它不仅适用于while和for循环,还适用于try块.breakreturn

您通常会在通常会提前退出循环的位置找到它,并且在循环结束时运行是一个意外/异常的场合.例如,如果您在列表中循环查找值:

for value in values:
    if value == 5:
        print "Found it!"
        break
else:
    print "Nowhere to be found. :-("
Run Code Online (Sandbox Code Playgroud)

  • 实际上,对于这样的事情来说,这是一个相当有用的构造。不知道有多少次我将 `found_it=False` 放在循环的开头,然后在最后对 `found_it` 进行 if 检查 (5认同)

Mar*_*ark 40

作为回答Is there a specific reason?,这里有一个有趣的应用:打破多个级别的循环.

它是如何工作的:外部循环在结尾处有一个中断,所以它只会被执行一次.但是,如果内部循环完成(找不到除数),则它到达else语句并且永远不会到达外部中断.这样,内部循环的中断将从两个循环中中断,而不是仅仅一个循环中断.

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'
    break
else:
    print 'no divisor could be found!'
Run Code Online (Sandbox Code Playgroud)

对于两个whilefor循环,else语句最后执行,除非break使用.

在大多数情况下,有更好的方法来执行此操作(将其包装到函数或引发异常),但这可行!


Sai*_*man 20

else 子句仅在while 条件变为假时执行。

这里有些例子:

示例 1:最初条件为假,因此执行else-clause

i = 99999999

while i < 5:
    print(i)
    i += 1
else:
    print('this')
Run Code Online (Sandbox Code Playgroud)

输出:

this
Run Code Online (Sandbox Code Playgroud)

例2:同时条件 i < 5从来没有成为因为假i == 3突破的循环,所以else从句未执行。

i = 0

while i < 5:
    print(i)
    if i == 3:
        break
    i += 1
else:
    print('this')
Run Code Online (Sandbox Code Playgroud)

输出:

0
1
2
3
Run Code Online (Sandbox Code Playgroud)

实施例3:而条件 i < 5成为当假i5,所以else从句被执行。

i = 0

while i < 5:
    print(i)
    i += 1
else:
    print('this')
Run Code Online (Sandbox Code Playgroud)

输出:

0
1
2
3
4
this
Run Code Online (Sandbox Code Playgroud)


Mar*_*off 18

当while条件求值为false时执行else子句.

文档:

只要表达式为true,while语句就用于重复执行:

while_stmt ::=  "while" expression ":" suite
                ["else" ":" suite]
Run Code Online (Sandbox Code Playgroud)

这反复测试表达式,如果是,则执行第一个套件; 如果表达式为假(可能是第一次测试)else,则执行该子句的套件(如果存在)并且循环终止.

一个break在首套房执行的语句终止循环,不执行该else条款的套件.continue在第一个套件中执行的语句会跳过套件的其余部分,然后返回测试表达式.


HVN*_*ing 14

我的答案将集中在我们何时可以使用while/for-else.

乍一看,使用时似乎没有什么不同

while CONDITION:
    EXPRESSIONS
print 'ELSE'
print 'The next statement'
Run Code Online (Sandbox Code Playgroud)

while CONDITION:
    EXPRESSIONS
else:
    print 'ELSE'
print 'The next statement'
Run Code Online (Sandbox Code Playgroud)

因为print 'ELSE'语句似乎总是在两种情况下都执行(无论是在while循环结束还是不运行时).

然后,只有在print 'ELSE'不执行语句时才会有所不同.这是break在代码块里面有一个内部的时候while

In [17]: i = 0

In [18]: while i < 5:
    print i
    if i == 2:
        break
    i = i +1
else:
    print 'ELSE'
print 'The next statement'
   ....:
0
1
2
The next statement
Run Code Online (Sandbox Code Playgroud)

如果不同于:

In [19]: i = 0

In [20]: while i < 5:
    print i
    if i == 2:
        break
    i = i +1
print 'ELSE'
print 'The next statement'
   ....:
0
1
2
ELSE
The next statement
Run Code Online (Sandbox Code Playgroud)

return 不在此类别中,因为它对上述两种情况具有相同的效果.

异常引发也不会产生差异,因为当它引发时,下一个代码将在异常处理程序(块除外)中执行,else子句之后的while子句中的代码将不会被执行.


Ilu*_*tar 8

我知道这是个老问题,但是......

正如 Raymond Hettinger 所说,它应该被称为while/no_break而不是while/else.
如果你看看这个片段,我发现很容易理解。

n = 5
while n > 0:
    print n
    n -= 1
    if n == 2:
        break
if n == 0:
    print n
Run Code Online (Sandbox Code Playgroud)

现在不是在 while 循环之后检查条件,我们可以交换它else并摆脱该检查。

n = 5
while n > 0:
    print n
    n -= 1
    if n == 2:
        break
else:  # read it as "no_break"
    print n
Run Code Online (Sandbox Code Playgroud)

我总是阅读它while/no_break来理解代码,这种语法对我来说更有意义。