我注意到下面的代码在Python中是合法的。我的问题是为什么?有什么特别的原因吗?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
许多初学者在尝试在while或for循环中放入if/else块时无意中发现了这种语法,并且没有正确地缩进else。解决方案是确保else块与if块对齐,假设您打算对它们进行配对。这个问题解释了为什么它没有导致语法错误,以及产生的代码意味着什么。我还得到了一个IndentationError。我该怎么解决呢?,用于报告语法错误的情况。
else子句只在while条件变为false时执行。如果跳出循环,或者引发异常,则不会执行该循环。
一种考虑它的方法是作为一个关于条件的if/else结构:
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()
我的回答将集中在我们什么时候可以使用while/for-else。
乍一看,使用时似乎没有什么不同
while CONDITION:
EXPRESSIONS
print 'ELSE'
print 'The next statement'
and
while CONDITION:
EXPRESSIONS
else:
print 'ELSE'
print 'The next statement'
因为打印'ELSE'语句似乎总是在这两种情况下执行(当while循环结束或不运行时)。
然后,只有当打印'ELSE'语句不被执行时,情况才有所不同。
它是在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
如与:
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
Return不在此类别中,因为它对上述两种情况具有相同的效果。
异常引发也不会造成差异,因为当它引发时,下一个代码将在异常处理程序中执行(block除外),else子句或while子句后面的代码将不会被执行。
请允许我举例说明为什么要使用else子句。但是:
我的观点在Leo的回答中得到了更好的解释
我使用for-而不是while-循环,但else工作类似(除非遇到break,否则执行)
有更好的方法可以做到这一点(例如,将其包装到函数中或引发异常)
打破多级循环
它是这样工作的:外部循环在结尾有一个break,所以它只会执行一次。但是,如果内部循环完成(没有找到除数),那么它将到达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!'
如果while循环没有中断,则执行Else。
我有点喜欢用“跑步者”来比喻。
“else”就像越过终点线,与你是从赛道的起点还是终点出发无关。"else"只有当你在两者之间的某个地方中断时才不会执行。
runner_at = 0 # or 10 makes no difference, if unlucky_sector is not 0-10
unlucky_sector = 6
while runner_at < 10:
print("Runner at: ", runner_at)
if runner_at == unlucky_sector:
print("Runner fell and broke his foot. Will not reach finish.")
break
runner_at += 1
else:
print("Runner has finished the race!") # Not executed if runner broke his foot.
主要的用例是使用这种打破嵌套循环,或者如果你想只在循环没有在某处中断时运行某些语句(认为中断是一种不寻常的情况)。
例如,下面是一个关于如何在不使用变量或try/catch的情况下跳出内部循环的机制:
for i in [1,2,3]:
for j in ['a', 'unlucky', 'c']:
print(i, j)
if j == 'unlucky':
break
else:
continue # Only executed if inner loop didn't break.
break # This is only reached if inner loop 'breaked' out since continue didn't run.
print("Finished")
# 1 a
# 1 b
# Finished
else子句只在while条件为false时执行。
下面是一些例子:
例1:初始条件为false,因此执行else-clause。
i = 99999999
while i < 5:
print(i)
i += 1
else:
print('this')
输出:
this
例2:while-condition i < 5永远不会变成false,因为i == 3打破了循环,所以else-clause没有执行。
i = 0
while i < 5:
print(i)
if i == 3:
break
i += 1
else:
print('this')
输出:
0
1
2
3
例3:while-condition i < 5在i为5时变为false,因此执行else-clause。
i = 0
while i < 5:
print(i)
i += 1
else:
print('this')
输出:
0
1
2
3
4
this