1.8 Iteration#

Estimated time for this notebook: 10 minutes

Our other aspect of control is looping back on ourselves.

We use forin to “iterate” over lists:

mylist = [3, 7, 15, 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.

1.8.1 Iterables#

Any sequence type is iterable:

vowels = "aeiou"
sarcasm = []

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

    sarcasm.append(letter * repetition)

"".join(sarcasm)
'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.

current_year = 2022
founded = {"Barack Obama": 1961, "UCL": 1826, "The Alan Turing Institute": 2015}

for thing in founded:
    print(f"In {current_year} {thing} is {current_year - founded[thing]} years old.")
In 2022 Barack Obama is 61 years old.
In 2022 UCL is 196 years old.
In 2022 The Alan Turing Institute is 7 years old.

1.8.2 Unpacking and Iteration#

Unpacking can be useful with iteration:

triples = [[4, 11, 15], [39, 4, 18]]
for whatever in triples:
    print(whatever)
[4, 11, 15]
[39, 4, 18]
for first, middle, last in triples:
    print(middle)
11
4
# 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:

things = {
    "James": [1976, "Kendal"],
    "UCL": [1826, "Bloomsbury"],
    "Cambridge": [1209, "Cambridge"],
}

print(things.items())
dict_items([('James', [1976, 'Kendal']), ('UCL', [1826, 'Bloomsbury']), ('Cambridge', [1209, 'Cambridge'])])
for name, year in founded.items():
    print(name, "is", current_year - year, "years old.")
Barack Obama is 61 years old.
UCL is 196 years old.
The Alan Turing Institute is 7 years old.

1.8.3 Break, Continue#

  • Continue skips to the next turn of a loop

  • Break stops the loop early

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.