Loops#

Often, code blocks need to be executed repeatedly. In notebooks, we just may execute a code cell at the desired times.

But often it’s better to use loops, also part of the control flow tools.

See also:

For loops#

For looping over a range of numbers, we can use a simple for loop and the range function.

The range function helps to easily define the number of loop executions.

In the following cell, the print(i) command will be executed a couple of times for different values of i - we iterate over a range of values.

Like for the if statement, the to-be executed code block needs to be intended. Also remember that the defined end in a range is not inclusive:

for i in range(0, 5):
    print(i)
0
1
2
3
4

You can also loop over a range of numbers with a defined step, for example, step 3:

for i in range(0, 10, 3):
    print(i)
0
3
6
9

Iterating over arrays allows you to do something with all array elements:

for animal in ["Dog", "Cat", "Mouse"]:
    print(animal)
Dog
Cat
Mouse

Using the built-in zip function, we can iterate over two arrays in parallel, pair-wise like this:

# going through arrays pair-wise
measurement_1 = [1, 9, 7, 1, 2, 8, 9, 2, 1, 7, 8]
measurement_2 = [4, 5, 5, 7, 4, 5, 4, 6, 6, 5, 4]

for m_1, m_2 in zip(measurement_1, measurement_2):
    print("Paired measurements: " + str(m_1) + " and " + str(m_2))
Paired measurements: 1 and 4
Paired measurements: 9 and 5
Paired measurements: 7 and 5
Paired measurements: 1 and 7
Paired measurements: 2 and 4
Paired measurements: 8 and 5
Paired measurements: 9 and 4
Paired measurements: 2 and 6
Paired measurements: 1 and 6
Paired measurements: 7 and 5
Paired measurements: 8 and 4

If we want to know the index of the element in the list as well, the built-in enumerate function comes in handy:

# numbering and iterating through collections
for index, animal in enumerate(["Dog", "Cat", "Mouse"]):
    print(f"The animal number {index} in the list is {animal}")
The animal number 0 in the list is Dog
The animal number 1 in the list is Cat
The animal number 2 in the list is Mouse

Generating lists in loops#

We can generate lists using for loops. The conventional way of doing this involves multiple lines of code:

# we start with an empty list
numbers = []

# and add elements
for i in range(0, 5):
    numbers.append(i * 2)
    
print(numbers)
[0, 2, 4, 6, 8]

One can also write that shorter. The underlying concept is called generators.

This is also part of what the community calls “The Pythonic Way” - making use of available classes and concepts to write short, clean, and understandable code.

numbers = [i * 2 for i in range(0, 5)]

print(numbers)
[0, 2, 4, 6, 8]

The conventional way to combine this with an if-statement looks like this:

# we start with an empty list
numbers = []

# and add elements
for i in range(0, 5):
    # check if the number is odd
    if i % 2:
        numbers.append(i * 2)
    
print(numbers)
[2, 6]

And the “Pythonic Way” like this:

numbers = [i * 2 for i in range(0, 5) if i % 2]

print(numbers)
[2, 6]

While loops#

Another way of looping is using the while loop. It checks a condition before each iteration, similar to the if statement. It will interrupt execution as soon as the condition is no longer true:

number = 1024

while (number > 1):
    number = number / 2
    print(number)
512.0
256.0
128.0
64.0
32.0
16.0
8.0
4.0
2.0
1.0

Interrupting loops#

You can interrupt loops at specific points in your code using the break command:

for i in range(10):
    print(i)
    if i > 5:
        break
0
1
2
3
4
5
6
number = 1024

while (True):
    number = number / 2
    print(number)
    
    if number < 1:
        break
512.0
256.0
128.0
64.0
32.0
16.0
8.0
4.0
2.0
1.0
0.5

Skipping iterations in loops#

If you want to skip iterations, you can use the continue statement. That often makes sense in combination with an if:

for i in range(0, 10):
    if (i >= 3) and (i <= 6):
        continue
    print(i)
0
1
2
7
8
9

Exercise#

Assume you have a list of filenames, and you want to do something with them, for example, print them out.
Write a for loop which prints out all file names that end with “tif”.

file_names = ['dataset1.tif', 'dataset2.tif', 'summary.csv', 'readme.md', 'blobs.tif']