Why does Python have "else" in "for-else" and "while-else"?

I am a Python beginner. I find that the "else" in “for-else” and "while-else" is completely unnecessary. Because "for" and "while" will finally run to "else", and we can use the usual lines instead.

For example:

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

And

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

are the same.

So why does Python have "else" in "for-else" and "while-else"?

Answers


You are wrong about the semantics of for/else. The else clause runs only if the loop completed, for example, if a break statement wasn't encountered.

The typical for/else loop looks like this:

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

Think of the "else" as pairing with all of the "if's" in the loop body. Your samples are the same, but with "break" statements in the mix, they are not.

A longer description of the same idea: http://nedbatchelder.com/blog/201110/forelse.html


The for ... else statement is used to implement search loops.

In particular, it handles the case where a search loop fails to find anything.

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

output:

we found 5
z =  5

That search is the same as

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

Remember that for doesn't initialize z if the search list is empty (i.e. []). That's why we have to ensure that z is defined when we use it after the search. The following will raise an exception because z is not defined when we try to print it.

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

print "z = ",z

output

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

In summary, the else clause will execute whenever the for loop terminates naturally. If a break or an exception occurs in the for loop the else statement will not execute.


Need Your Help

AngularJS + Safari: Force page to scroll to top when pages switch

angularjs safari

I am having an odd, safari-only scrolling behavior using AngularJS.

glassfish in eclipse doesn't seem to see my JDK

eclipse java-ee glassfish java

I am trying to get glassfish working in eclipse, and running into the JRE vs JDK error: