else where appropriate in a loop¶
The Python language provides a built-in
else clause for
for loops. If a
for loop completes without being prematurely interrupted by a
return statement, then the
else clause of the loop is executed.
The code below searches a list for a magic number. If the magic number is found in the list, then the code prints
Magic number found. If the magic number is not found, then the code prints
Magic number not found.
The code uses a flag variable called
found to keep track of whether or not the magic number was found in the list.
The logic in this code is valid; it will accomplish its task. But the Python language has built-in language constructs for handling this exact scenario and which can express the same idea much more concisely and without the need for flag variables that track the state of the code.
l = [1, 2, 3] magic_number = 4 found = False for n in l: if n == magic_number: found = True print("Magic number found") break if not found: print("Magic number not found")
else clause with
In Python, you can declare an
else loop in conjunction with a
for loop. If the
for loop iterates to completion without being prematurely interrupted by a
return statement, then Python executes the
else clause of the loop.
In the modified code below, the
for loop will iterate through all three items in the list. Because the magic number is not contained in the list, the
if statement always evaluates to
False, and therefore the
break statement is never encountered. Because Python never encounters a
break statement while iterating over the loop, it executes the
The modified code below is functionally equivalent to the original code above, but this modified code is more concise than the original code and does not require any flag variables for monitoring the state of the code.
l = [1, 2, 3] magic_number = 4 for n in l: if n == magic_number: print("Magic number found") break else: print("Magic number not found")
else on a
for loop is so unintuitive and error-prone, even some experienced Python developers suggest not using this feature at all.