我理解这种结构是如何运作的:
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 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
The easiest way I found to 'get' what the for/else did, and more importantly, when to use it, was to concentrate on where the break statement jumps to. The For/else construct is a single block. The break jumps out of the block, and so jumps 'over' the else clause. If the contents of the else clause simply followed the for clause, it would never be jumped over, and so the equivalent logic would have to be provided by putting it in an if. This has been said before, but not quite in these words, so it may help somebody else. Try running the following code fragment. I'm wholeheartedly in favour of the 'no break' comment for clarity.
for a in range(3):
print(a)
if a==4: # change value to force break or not
break
else: #no break +10 for whoever thought of this decoration
print('for completed OK')
print('statement after for loop')
编辑-我注意到这个问题仍然在运行
第二个更好的想法……
“没有休息”的评论是负面的。要理解一个正的断言要容易得多,那就是for可迭代对象已经用完了。
for a in range(3):
print(a)
if a==4: # change value to force break or not
print('ending for loop with a break')
break
else: # for iterable exhausted
print('ending for loop as iterable exhausted')
print('for loop ended one way or another')
这也强化了这种解释
if iterable_supplies_a_value:
run_the_for_with_that_value
else:
do_something_else
下面是一种我从未见过其他人提到过的思考方法:
首先,请记住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时。
由于技术部分已经回答了很多,我的评论只是与产生这个循环关键字的混淆有关。
由于Python是一种非常雄辩的编程语言,关键字的误用更加臭名昭著。else关键字完美地描述了决策树的部分流程,“如果你不能做这个,(else)做那个”。这在我们自己的语言中是隐含的。
相反,与while和for语句一起使用这个关键字会造成混淆。原因是,我们作为程序员的职业生涯告诉我们else语句存在于决策树中;它的逻辑作用域是一个有条件地返回要遵循的路径的包装器。同时,循环语句有一个象征性的明确目标来达到某些东西。目标是在流程的连续迭代之后实现的。
If / else表示要遵循的路径。循环遵循一条路径,直到“目标”完成。
问题是else这个词清楚地定义了条件中的最后一个选项。这个词的语义是Python和人类语言共享的。但是在人类语言中,这个词从来没有用来表示某人或某物在某事完成后将采取的行动。如果在完成它的过程中出现了问题(更像是break语句),就会使用它。
最后,关键字将保留在Python中。很明显这是一个错误,当每个程序员都试图像记忆工具一样想出一个故事来理解它的用法时,就更清楚了。如果他们选择了关键词,我会很喜欢的。我相信这个关键字非常适合迭代流程,即循环后的收益。
这就像有些孩子组装玩具的每一步都会遇到的情况:然后呢,爸爸?