Else clause on Python while statement
else clause is only executed when your
while condition becomes false. If you
break out of the loop, or if an exception is raised, it won't be executed.
One way to think about it is as an if/else construct with respect to the condition:
if condition: handle_true()else: handle_false()
is analogous to the looping construct:
while condition: handle_true()else: # condition is false now, handle and go on with the rest of the program handle_false()
An example might be along the lines of:
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()
else clause is executed if you exit a block normally, by hitting the loop condition or falling off the bottom of a try block. It is not executed if you
return out of a block, or raise an exception. It works for not only while and for loops, but also try blocks.
You typically find it in places where normally you would exit a loop early, and running off the end of the loop is an unexpected/unusual occasion. For example, if you're looping through a list looking for a value:
for value in values: if value == 5: print "Found it!" breakelse: print "Nowhere to be found. :-("
In reply to
Is there a specific reason?, here is one interesting application: breaking out of multiple levels of looping.
Here is how it works: the outer loop has a break at the end, so it would only be executed once. However, if the inner loop completes (finds no divisor), then it reaches the else statement and the outer break is never reached. This way, a break in the inner loop will break out of both loops, rather than just one.
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' breakelse: print 'no divisor could be found!'
for loops, the
else statement is executed at the end, unless
break was used.
In most cases there are better ways to do this (wrapping it into a function or raising an exception), but this works!