为什么Python在“for-else”和“while-else”中有“else”?

时间:2012-07-20 02:49:31

标签: python python-3.x

我是Python初学者。我发现“for-else”和“while-else”中的“else”完全没必要。因为“for”和“while”最终将运行到“else”,我们可以使用常用的行。

例如:

for i in range(1, 5):
    print i
else:
    print 'over'

for i in range(1, 5):
    print i
print 'over'

是一样的。

那么为什么Python在“for-else”和“while-else”中有“else”?

2 个答案:

答案 0 :(得分:26)

你对for / else的语义错了。 else子句仅在循环完成时运行,例如,如果未遇到break语句。

典型的for / else循环如下所示:

for x in seq:
    if cond(x):
        break
else:
    print "Didn't find an x I liked!"

将“else”视为与循环体中所有“if”的配对。你的样本是相同的,但在混合中使用“break”语句,它们不是。

对同一想法的更长描述:http://nedbatchelder.com/blog/201110/forelse.html

答案 1 :(得分:1)

for ... else语句用于实现搜索循环。

特别是,它处理搜索循环无法找到任何内容的情况。

for z in xrange(10):
    if z == 5:
        # We found what we are looking for
        print "we found 5"
        break # The else statement will not execute because of the break
else:

    # We failed to find what we were looking for
    print "we failed to find 5"
    z = None

print 'z = ', z

输出:

we found 5
z =  5

该搜索与

相同
z = None
for z in xrange(10):
    if 5 == z:
        # We found what we are looking for
        break

if z == None:
    print "we failed to find 5"
else:
    print "we found 5"

print 'z = ', z

请注意,如果搜索列表为空(for),则[]不会初始化z。这就是为什么我们必须确保在搜索后使用z时定义z。以下内容将引发异常,因为在我们尝试打印时未定义z

for z in []:
    if 5 == z:
        break

print "z = ",z

输出

    print "z = ",z
NameError: name 'z' is not defined

总之,只要else循环自然终止,for子句就会执行。如果for循环中发生中断或异常,else语句将不会执行。