The for and while compound statements (loops) can optionally have an else clause (in practice, this usage is fairly rare).

The else clause only executes after a for loop terminates by iterating to completion, or after a while loop terminates by its conditional expression becoming false.

for i in range(3):
    print(i)
else:
    print('done')

i = 0
while i < 3:
    print(i)
    i += 1
else:
    print('done')

output:

0
1
2
done

The else clause does not execute if the loop terminates some other way (through a break statement or by raising an exception):

for i in range(2):
    print(i)
    if i == 1:
        break
else:
    print('done')

output:

0
1

Most other programming languages lack this optional else clause of loops. The use of the keyword else in particular is often considered confusing.

The original concept for such a clause dates back to Donald Knuth and the meaning of the else keyword becomes clear if we rewrite a loop in terms of if statements and goto statements from earlier days before structured programming or from a lower-level assembly language.

For example:

while loop_condition():
    ...
    if break_condition():
        break
    ...

is equivalent to:

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>

<<end>>:

These remain equivalent if we attach an else clause to each of them.

For example:

while loop_condition():
    ...
    if break_condition():
        break
    ...
else:
    print('done')

is equivalent to:

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>
else:
    print('done')

<<end>>: