Loops#

Insanity is doing the same thing over and over again and expecting different results.
— Albert Einstein
Slides/PDF#
Often, blocks of code need to be executed multiple times. If the number or amount of repetitions is known beforehand, use the for
-Loop for that. There are two types of For-Loops:
For-Loop: Repeat the loop exactly \(n\) times
For-Each-Loop (Iterator): Repeat the loop for each element in a sequence
Repetitions with a Known Count#
For-Each Loop Over Sequences#
The for
loop in Python is a for-each loop. It always iterates through a sequence of values, such as a list. The variable of the iterator e
contains the current value of the sequence seq
. This makes it very easy to iterate through lists.
seq = ['a','b','c']
for e in seq:
print(e)
a
b
c
or tuples
seq = ('a','b','c')
for e in seq:
print(e)
a
b
c
For loop with a known number of iterations \(n\)#
The for
loop in Python can also be used as a classic for loop, in which you repeat something \(n\) times. To do this, you generate a sequence of numbers with the range(n)
function, over which you then iterate as usual in a for-each loop. The iterator i
takes on the value of the counting index.
n = 3
seq = range(n)
for i in seq:
print(i)
0
1
2
The difference becomes clearer when you look at how you would iterate through the above list using a numbered index. To do this, determine the length of the sequence with len()
, generate a numeric iterator with range()
, and then access the list’s indexed values with seq[i]
. This corresponds to a classic for-loop over an array, as you would find, for example, in C or Java.
seq = ['a','b','c']
for i in range(len(seq)):
value = seq[i]
print(f"Index: {i}; Wert {value}")
Index: 0; Wert a
Index: 1; Wert b
Index: 2; Wert c
Since this is quite cumbersome, Python offers the enumerate
function as a simplification. It turns any sequence into a numbered sequence. This is useful if you also need the index i
for another reason.
sequence = ['a', 'b', 'c']
for i, value in enumerate(sequence):
print(f"Index: {i}; Value {value}")
Index: 0; Value a
Index: 1; Value b
Index: 2; Value c
For-Each Loop with Dictionaries#
You can also iterate over dictionaries with a for loop. For this, you can either iterate over the keys and then look up the corresponding value via seq[key]
.
seq = {"key1":"wert1", "key2":"wert2", "key3":"wert3"}
for key in seq:
value = seq[key]
print(f"Schlüssel: {key}; Wert {value}")
Schlüssel: key1; Wert wert1
Schlüssel: key2; Wert wert2
Schlüssel: key3; Wert wert3
Or one can iterate directly over all key-value pairs.
for key, value in seq.items():
print(f"Schlüssel: {key}; Wert {value}")
Schlüssel: key1; Wert wert1
Schlüssel: key2; Wert wert2
Schlüssel: key3; Wert wert3
For-Loop Example#
This can then be used, for example, to convert a list of measurements from imperial feet into metric meters.
feet_measurements = [4.2, 2.3, 6.2, 10.5] # Input
meters_measurements = [] # Results
for feet in feet_measurements:
meters_measurements.append(0.3048 * feet)
print(meters_measurements)
[1.2801600000000002, 0.70104, 1.88976, 3.2004]
In Python there’s also a shorthand for such simple for-loops, a form of syntactic sugar.
measurements_meter = [0.3048 * feets for feets in measurements_feet]
print(measurements_meter)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[9], line 1
----> 1 measurements_meter = [0.3048 * feets for feets in measurements_feet]
3 print(measurements_meter)
NameError: name 'measurements_feet' is not defined
Unknown Number of Repetitions#
While loops are primarily used when the length of the loop is not known at the outset. The loop is repeated as long as a certain condition holds. In computer science, the following types are distinguished:
While loop: Repeat as long as a condition is true (possibly never)
Do-While loop: Repeat until a condition is false (i.e., at least once)
Repeat-Until loop: Repeat until a condition becomes true (i.e., at least once)
While-Loop#
In a while loop, the condition may already be false at the start. The loop therefore does not need to be executed.
count = 3
while count > 0:
print(f"Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife {count} > 0 wahr ist")
count -= 1 # we decrement the variable count
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife 3 > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife 2 > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife 1 > 0 wahr ist
The while loop runs three times because the condition is true and we count down to zero.
The while loop is not executed because n is already 0.
count = 0
while count > 0:
print(f"Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife {count} > 0 wahr ist")
count -= 1 # we count the variable count down
Do-While-Loops#
In a do-while loop, the condition is checked only at the end. The loop is therefore always executed at least once. However, this behavior is identical to a while loop in which the condition is set to true at the beginning and is changed inside the loop.
n = 3
condition = True # Condition is always initialized as True
while condition:
n -= 1 # we decrement the variable n
condition = n > 0 # The condition is only updated at the end of the loop
print(f"Die Do-While-Schleife wird mindestens einmal ausgeführt bis die Bedingung am Ende der Schleife {n} > 0 wahr ist")
Die Do-While-Schleife wird mindestens einmal ausgeführt bis die Bedingung am Ende der Schleife 2 > 0 wahr ist
Die Do-While-Schleife wird mindestens einmal ausgeführt bis die Bedingung am Ende der Schleife 1 > 0 wahr ist
Die Do-While-Schleife wird mindestens einmal ausgeführt bis die Bedingung am Ende der Schleife 0 > 0 wahr ist
The do-while loop is also executed three times because the condition is true and we count down to zero.
The do-while loop runs once even though n is already 0.
counter = 0
condition = True # Condition is always initialized as True
while condition:
counter -= 1 # we decrement the counter variable
condition = counter > 0 # The condition is only updated at the end of the loop
print(f"The do-while loop will be executed at least once until the condition at the end of the loop {counter} > 0 is true")
The do-while loop will be executed at least once until the condition at the end of the loop -1 > 0 is true
Repeat-Until-Loop#
In a repeat-until loop, the condition is only checked at the end. Thus the loop is always executed at least once. However, the loop is repeated until the condition becomes true. So it is the negation of a do-while loop.
counter = -3
condition = False # Condition is always initialized as False
while not condition: # but negated in the while
counter += 1 # we increment the counter variable upwards
condition = counter > 0 # The condition is updated only at the end of the loop
print(f"Die Repeat-Until-Schleife wird mindestens einmal ausgeführt bis die Bedingung am Ende der Schleife {counter} > 0 falsch ist")
Die Repeat-Until-Schleife wird mindestens einmal ausgeführt bis die Bedingung am Ende der Schleife -2 > 0 falsch ist
Die Repeat-Until-Schleife wird mindestens einmal ausgeführt bis die Bedingung am Ende der Schleife -1 > 0 falsch ist
Die Repeat-Until-Schleife wird mindestens einmal ausgeführt bis die Bedingung am Ende der Schleife 0 > 0 falsch ist
Die Repeat-Until-Schleife wird mindestens einmal ausgeführt bis die Bedingung am Ende der Schleife 1 > 0 falsch ist
The repeat-until loop runs three times because the condition at the beginning is false and we count up to 0.
The do-while loop will run once, since n is greater than 0 at the end of the loop.
count = 0
condition = False # Condition is always initialized as False
while not condition: # but negated in the loop
count += 1 # we count up the variable count
condition = count > 0 # The condition is only updated at the end of the loop
print(f"Die Repeat-Until-Schleife wird mindestens einmal ausgeführt bis die Bedingung am Ende der Schleife {count} > 0 falsch ist")
Die Repeat-Until-Schleife wird mindestens einmal ausgeführt bis die Bedingung am Ende der Schleife 1 > 0 falsch ist
Endless Loops#
Warning
While loops have no maximum number of repetitions. They can potentially run forever if the condition never changes. Therefore it is always important to think through whether there exists a case in which the condition cannot change, and then to add a second termination condition (e.g., maximum iterations, maximum time, etc.).
Let’s take another look at our while_loop
function. How could this function become an infinite loop?
while n > 0:
print(f"Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife {n} > 0 wahr ist")
n -= 1 # we decrement the variable n
It looks like this isn’t possible at first glance. Nevertheless, as a precaution, we will define a second variant with an additional termination condition.
def while_loop_with_break(n, max_iterations=99):
iterations = 0
while n > 0 and iterations < max_iterations:
print(f"Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife {n} > 0 wahr ist")
n -= 1 # we count the variable n down
iterations += 1
print(f"Die While-Schleife wurde nach {iterations} von {max_iterations} beendet")
The above test case with 3 seems to be working.
while_loop_with_break(3)
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife 3 > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife 2 > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife 1 > 0 wahr ist
Die While-Schleife wurde nach 3 von 99 beendet
But what happens if we initialize the function with infinity (Infinity)? Subtracting or adding any finite number to infinity yields infinity. The variable n
will therefore never change.
import math # the number infinity is defined in the math library
while_loop_with_break(math.inf)
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wird ausgeführt wenn die Bedingung am Anfang der Schleife inf > 0 wahr ist
Die While-Schleife wurde nach 99 von 99 beendet
Break out of loops early or skip elements#
Sometimes you want to prematurely break out of a for/while loop. Python provides the break
statement for this. It breaks out of the loop at the current position (similar to repeat in a function). This allows you to implement additional termination conditions in the loop.
The continue
statement does not break out of the loop, but immediately starts the next iteration. This is useful, for example, when a filter condition is not met.
The following loop should find the first edible thing in my backpack.
things_in_my_backpack = ["Papier", "Stift", "Apfel", "Brot", "Messer"]
edibles = {"Apfel", "Brot"}
edible = None
for item in things_in_my_backpack: # Find the first edible item in my backpack
if item not in edibles:
print(f"Überspringe {item}")
continue
print(f"Essbares gefunden {item}")
edible = item
break
print("")
print(f"Ergebnis ist {edible}")
Überspringe Papier
Überspringe Stift
Essbares gefunden Apfel
Ergebnis ist Apfel
We see that the loop over Papier
and Stift
skips them and does not write "Essbares gefunden Papier"
.
As soon as the loop finds some edible item, it outputs "Essbares gefunden Apfel"
and ends the loop, even though Brot
and Messer
are still in the backpack.
Both are common commands to improve the performance of loops.
Infinite loops with a timeout#
With break
you can implement additional termination conditions, such as a maximum execution time. For example, define an additional timeout in an infinite loop of 10 seconds using the time()
function from the time
package, which returns the current time (since 1970) in seconds.
import time
iterations = 0
start = time.time() # we store the start time
while True: # THIS IS AN INFINITE LOOP
iterations += 1
elapsed = time.time() - start # we calculate the time difference in seconds
if elapsed > 3:
print(f"Timeout after {elapsed}s and {iterations} iterations")
break # We break the loop
Timeout after 3.0000009536743164s and 52397990 iterations
However, this isn’t a good way to pause a program for a while. For that, you should instead use the sleep()
function from the time
package. Note the execution time below the cell.
start = time.time() # we store the start time
time.sleep(3) # we sleep for 3 seconds
print(f"Sleeped for {time.time() - start}s") # we print the time difference
Sleeped for 3.0027010440826416s
Loops - Infinite Loops!#
While loops have no maximum number of iterations. They can potentially run forever if the condition never changes.
Condition = True
while Condition: # THIS IS AN INFINITE LOOP
# Statement
Condition = True # Condition never changes!
Loops - Breaking out of a loop early#
break
-Befehl: Aborts the loop at its current position
continue
-Befehl: Does not abort the loop, but immediately starts the next iteration
things_in_my_backpack = ["Paper", "Pen", "Apple", "Bread", "Knife"]
edibles = {"Apple", "Bread"}
edible = None
for item in things_in_my_backpack: # Find the first edible item
if item not in edibles:
print(f"Skipping {item}")
continue
print(f"Edible found: {item}")
edible = item
break
print(edible)
Loops - Breaking out of a loop early#
With break
you can implement additional termination conditions, such as a maximum execution time. Here we define an additional timeout in an infinite loop of 3 seconds:
import time
iterations = 0
start = time.time()
while True: # THIS IS AN INFINITE LOOP
iterations += 1
elapsed = time.time() - start
if elapsed > 3:
print(f"Timeout after {iterations} iterations")
break