This note aims at explaining the concept of iterations and loop constructs in Python.

Loops in Python

We have already seen, both in homework and midterm, what a pain it can be if you wanted to repeat a certain number of tasks using recursive functions and if-blocks. Fortunately, Python has loop statements that can highly simplify the task of repeating certain statements for a certain number of times.

While loop

One such statement is the while-loop:

while this_logical_statement_holds_true : 
    perform_statements

For example, here is a code that prints all positive integers smaller than a given input integer,

n = int(input('input a positive integer: '))
print( 'Here are all positive integers smaller than {}'.format(n) )
while n > 1:
    n -= 1
    print(n)
input a positive integer: 7
Here are all positive integers smaller than 7
6
5
4
3
2
1

Another useful way of writing while-loops is the following (using the example above),

n = int(input('input a positive integer: '))
print( 'Here are all positive integers smaller than {}'.format(n) )
while True:
    n -= 1
    print(n)
    if n == 1: break
input a positive integer: 7
Here are all positive integers smaller than 7
6
5
4
3
2
1

In this case, the loop will continue forever, unless the condition n==1 is met at some point during the iteration.

For loop

If you are from a Fortran, C, C++ background you may be already accustomed to counting loops than while loops. Python does not have a direct method for counting loops, however, there is a for-loop syntax that loops over the elements of a list or tuple. For example, if we wanted to rewrite the above code using for-loop, one solution would be like the following,

n = int(input('input a positive integer: '))
print( 'Here are all positive integers smaller than {}'.format(n) )
my_range = range(n-1,0,-1)
for n in my_range:
    print(n)
input a positive integer: 7
Here are all positive integers smaller than 7
7
6
5
4
3
2
1

Here the Python’s builtin function range([start,] stop [, step]) creates a list of integer that starts from start to end but not including end, with a distance of size step between the elements. Here is another way of doing the same thing as in the above example,

n = int(input('input a positive integer: '))
print( 'Here are all positive integers smaller than {}'.format(n) )
mylist = list(range(n-1,0,-1))
for n in mylist:
    print(n)
input a positive integer: 7
Here are all positive integers smaller than 7
6
5
4
3
2
1

Note how I have used the range function in order to get the same output as in the previous example.

n = int(input('input a positive integer: '))
mylist = list(range(n-1,0,-1))
print(mylist)
input a positive integer: 7  
[6, 5, 4, 3, 2, 1]

​For-loop with list indices

Instead of iterating over a list directly, as illustrated above, one could iterate over the indices of a list,

mylist = ['amir','jake','lecero','mike','travis']
for i in range(len(mylist)):
    print(mylist[i])
amir
jake
lecero
mike
travis

Manipulating lists using for-loop

Note that when you want to change the elements of a list in a for-loop, you have to change the list itself, and not simply the for-loop variable.

mydigits = [1,3,5,7,9]
for i in mydigits:
    i -= 1
mydigits
[1, 3, 5, 7, 9]

The above code won’t change the values in the list, instead only the for-loop variable. If you want to change the list itself, you have to operate on the list elements directly,

mydigits = [1,3,5,7,9]
for i in range(len(mydigits)):
    mydigits[i] -= 1
mydigits
[0, 2, 4, 6, 8]

List comprehension

Frequently in Python programming, you may need to create long lists of regularly-ordered item. As a result, Python has a special concise syntax for such tasks, called list comprehension which uses for-loop. For example, suppose you have a list of odd digits as in the example above, and you want to create a list of even digits from it. You could achieve this using the following simple syntax,

odd_digits = [1,3,5,7,9]
even_digits = [i-1 for i in odd_digits]
even_digits
[0, 2, 4, 6, 8]

Simultaneous looping over multiple lists

Suppose you have two or more lists of the same length over the elements of which you want to perform a specific set of tasks simultaneously. To do so, it suffices to create a list of tuples using Python’s builtin function zip and loop over the tuple elements of this list. For example, let’s assume that you wanted to create a list of the addition of individual elements in the above two lists: odd_digits and even_digits. One way to do it would be the following,

sum_even_odd = []
for i,j in zip(odd_digits,even_digits):
    sum_even_odd.append(i+j) 
sum_even_odd
[1, 5, 9, 13, 17]

​Looping over dictionary items

Dictionaries in Python are composed on key-value pairs, therefore looping over them is slight different than looping over lists,

name_dict = {'amir':'teacher','jake':'student','lecero':'student','mike':'student','travis':'student'}
for key, value in name_dict.items():
    print( "{0} is a {1}.".format(key,value) )
amir is a teacher.
jake is a student.
lecero is a student.
mike is a student.
travis is a student.

Here in order to extract the key-value pairs from inside the dictionary, we have used the items() method belonging to dictionary objects in Python.

Exercise

  1. The while-loop implementation of for-loop: web-link

  2. Modifying the index of a for-loop: web-link

  3. Impact of machine precision on numerical computation: web-link

  4. Impact of round-off errors on numerical computations: web-link

  5. String concatenation using for-loop: web-link

  6. Computing the Fibonacci sequence via for-loop: web-link