XClose

MPHY0021: Research Software Engineering With Python

Home
Menu

Iteration

Our other aspect of control is looping back on ourselves.

We use for ... in to "iterate" over lists:

In [1]:
mylist = [3, 7, 15, 2]
In [2]:
for whatever in mylist:
    print(whatever ** 2)
9
49
225
4

Each time through the loop, the variable in the value slot is updated to the next element of the sequence.

Iterables

Any sequence type is iterable:

In [3]:
vowels = "aeiou"
sarcasm = []

for letter in "Okay":
    if letter.lower() in vowels:
        repetition = 3
    else:
        repetition = 1

    sarcasm.append(letter * repetition)

"".join(sarcasm)
Out[3]:
'OOOkaaay'

The above is a little puzzle, work through it to understand why it does what it does.

 Dictionaries are Iterables

All sequences are iterables. Some iterables (things you can for loop over) are not sequences (things with you can do x[5] to), for example sets and dictionaries.

In [4]:
import datetime
now = datetime.datetime.now()

founded = {"Eric": 1943, "UCL": 1826, "Cambridge": 1209}

current_year = now.year

for thing in founded:
    print(thing, " is ", current_year -  founded[thing], "years old.")
Eric  is  78 years old.
UCL  is  195 years old.
Cambridge  is  812 years old.

Unpacking and Iteration

Unpacking can be useful with iteration:

In [5]:
triples = [
    [4, 11, 15], 
    [39, 4, 18]
]
In [6]:
for whatever in triples:
    print(whatever)
[4, 11, 15]
[39, 4, 18]
In [7]:
for first, middle, last in triples:
    print(middle)
11
4
In [8]:
# A reminder that the words you use for variable names are arbitrary:
for hedgehog, badger, fox in triples:
    print(badger)
11
4

for example, to iterate over the items in a dictionary as pairs:

In [9]:
things = {"Eric": [1943, 'South Shields'], 
          "UCL": [1826, 'Bloomsbury'], 
          "Cambridge": [1209, 'Cambridge']}

print(things.items())
dict_items([('Eric', [1943, 'South Shields']), ('UCL', [1826, 'Bloomsbury']), ('Cambridge', [1209, 'Cambridge'])])
In [10]:
for name, year in founded.items():
    print(name, " is ", current_year - year, "years old.")
Eric  is  78 years old.
UCL  is  195 years old.
Cambridge  is  812 years old.

Break, Continue

  • Continue skips to the next turn of a loop
  • Break stops the loop early
In [11]:
for n in range(50):
    if n == 20: 
        break
    if n % 2 == 0:
        continue
    print(n)
1
3
5
7
9
11
13
15
17
19

These aren't useful that often, but are worth knowing about. There's also an optional else clause on loops, executed only if you don't break, but I've never found that useful.

Classroom exercise: the Maze Population

Take your maze data structure. Write a program to count the total number of people in the maze, and also determine the total possible occupants.