On Fri, Nov 22, 2013 at 03:24:31PM +0100, Rafael Knuth wrote:
> Hej there,
> 
> newbie question: I struggle to understand what exactly those two
> subsequent for loops in the program below do (Python 3.3.0):
> 
> for x in range(2, 10):
>     for y in range(2, x):
>         if x % y == 0:
>             print(x, "equals", y, "*", x//y)
>             break
>     else:
>         print(x, "is a prime number")

The most tricky part here is, in my opinion, the "else" clause, because 
sadly it is badly named. It really should be called "then". A for-loop 
followed by an "else" means something like this:

for something in something:
    run this block for each value
else:
    then run this block


(Notice that the "else" lines up with the "for".)

What's the point of that? The point is that a "break" command jumps out 
of the *complete* for-else block. Try these examples:

for i in range(5):
    if i == 400: break
    print(i)
else:
    print("Finished loop!")


for i in range(5):
    if i == 4: break
    print(i)
else:
    print("Finished loop!")


So the "else" clause only runs after the for block provided you never 
break out of the loop.


Now, back to your nested loops. You have:

for x in range(2, 10):
    for y in range(2, x):
        ... more code here ...


The "for x" loop runs with x=2, x=3, x=4, ... x=9. For each of those 
values, the block inside the loop runs. Okay, so what's inside the 
block? It runs another for-loop, in this case a for-y loop. This ought 
to be more clear if you run a simpler (and shorter) example:

for x in range(2, 7):
    print("outer loop, x =", x)
    for y in range(2, x):
        print("inner loop, x =", x, "y =", y)


If you run that code, it should help you understand what the nested 
loops are doing.



-- 
Steven
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to