我理解这种结构是如何运作的:

for i in range(10):
    print(i)

    if i == 9:
        print("Too big - I'm giving up!")
        break
else:
    print("Completed successfully")

但我不明白为什么在这里使用else作为关键字,因为它表明有问题的代码只在for块未完成时运行,这与它所做的相反!无论我怎么想,我的大脑都不能从for语句无缝地过渡到else语句块。对我来说,continue和continuouswith更有意义(我正试着训练自己这样读它)。

我想知道Python程序员是如何在头脑中(或者大声地,如果你喜欢)阅读这个结构的。也许我遗漏了一些可以使这些代码块更容易破译的东西?


这个问题是关于底层设计决策的,也就是说,为什么能够编写这些代码是有用的。另请参阅Python while语句中的Else子句,了解语法含义的具体问题。


当前回答

for i in range(3):
    print(i)

    if i == 2:
        print("Too big - I'm giving up!")
        break;
else:
    print("Completed successfully")

"else"在这里非常简单,意思是

1、“if for从句是完整的”

for i in range(3):
    print(i)

    if i == 2:
        print("Too big - I'm giving up!")
        break;
if "for clause is completed":
    print("Completed successfully")

写“for从句已完成”这样长的语句是很笨拙的,所以他们引入了“else”。

否则这里本质上是一个如果。

2、然而,How about for从句根本没有出现

In [331]: for i in range(0):
     ...:     print(i)
     ...: 
     ...:     if i == 9:
     ...:         print("Too big - I'm giving up!")
     ...:         break
     ...: else:
     ...:     print("Completed successfully")
     ...:     
Completed successfully

所以这完全是逻辑组合:

if "for clause is completed" or "not run at all":
     do else stuff

或者这样说:

if "for clause is not partially run":
    do else stuff

或者这样:

if "for clause not encounter a break":
    do else stuff

其他回答

我把它读成这样:“当可迭代对象完全耗尽时,在完成for语句后,执行即将继续执行下一个语句,else子句将被执行。”因此,当迭代被break打断时,这将不会执行。

for i in range(3):
    print(i)

    if i == 2:
        print("Too big - I'm giving up!")
        break;
else:
    print("Completed successfully")

"else"在这里非常简单,意思是

1、“if for从句是完整的”

for i in range(3):
    print(i)

    if i == 2:
        print("Too big - I'm giving up!")
        break;
if "for clause is completed":
    print("Completed successfully")

写“for从句已完成”这样长的语句是很笨拙的,所以他们引入了“else”。

否则这里本质上是一个如果。

2、然而,How about for从句根本没有出现

In [331]: for i in range(0):
     ...:     print(i)
     ...: 
     ...:     if i == 9:
     ...:         print("Too big - I'm giving up!")
     ...:         break
     ...: else:
     ...:     print("Completed successfully")
     ...:     
Completed successfully

所以这完全是逻辑组合:

if "for clause is completed" or "not run at all":
     do else stuff

或者这样说:

if "for clause is not partially run":
    do else stuff

或者这样:

if "for clause not encounter a break":
    do else stuff

下面是一种我从未见过其他人提到过的思考方法:

首先,请记住for循环基本上只是while循环的语法糖。例如,循环

for item in sequence:
    do_something(item)

可以重写(大约)为

item = None
while sequence.hasnext():
    item = sequence.next()
    do_something(item)

其次,记住while循环基本上只是重复if块!你总是可以把while循环读成“如果这个条件为真,执行body,然后回来再次检查”。

因此while/else非常有意义:它与if/else结构完全相同,只是增加了循环直到条件变为false的功能,而不是只检查一次条件。

然后for/else也非常有意义:因为所有的for循环都只是while-循环之上的语法糖,你只需要弄清楚底层while-循环的隐式条件是什么,然后else对应于当条件变为False时。

这里是搜索之外的另一个惯用用例。假设您希望等待一个条件为真,例如,远程服务器上的一个端口打开,并伴有一些超时。然后你可以利用一点时间…其他结构如下:

import socket
import time

sock = socket.socket()
timeout = time.time() + 15
while time.time() < timeout:
    if sock.connect_ex(('127.0.0.1', 80)) is 0:
        print('Port is open now!')
        break
    print('Still waiting...')
else:
    raise TimeoutError()

我认为文档对else有很好的解释,继续

[…当循环因列表耗尽而终止(使用for)或当条件变为false(使用while)时执行,但当循环由break语句终止时不执行。”

来源:Python 2文档:控制流教程