5. for loop

5.1. Syntax

5.1.1. Generic syntax

  • DATA must implement iterator interface

  • More on iterators in chapter Iterators

Listing 11. for loop syntax
for <MY VARIABLE> in <DATA> :
    <CONTENT>

5.1.2. Example

Listing 12. for loop syntax: printing each number from list
DATA = ['a', 'b', 'c']

for letter in DATA:
    print(letter)

# 'a'
# 'b'
# 'c'
Listing 13. for loop syntax: data can be inline
for letter in ['a', 'b', 'c']:
    print(letter)

# 'a'
# 'b'
# 'c'

5.2. Iterating over str

  • Iterating str will get character on each iteration

Listing 14. Iterating over str
for letter in 'setosa':
    print(letter)

# s
# e
# t
# o
# s
# a

5.3. Iterating simple collections

5.3.1. Iterating over list

Listing 15. Iterating over list
DATA = [5.1, 3.5, 1.4, 0.2, 'setosa']

for element in DATA:
    print(element)

# 5.1
# 3.5
# 1.4
# 0.2
# 'setosa'

5.3.2. Iterating over tuple

Listing 16. Iterating over tuple
DATA = (5.1, 3.5, 1.4, 0.2, 'setosa')

for element in DATA:
    print(element)

# 5.1
# 3.5
# 1.4
# 0.2
# 'setosa'

5.3.3. Iterating over set

Listing 17. Iterating over set
DATA = {5.1, 3.5, 1.4, 0.2, 'setosa'}

for element in DATA:
    print(element)

# 5.1
# 3.5
# 1.4
# 0.2
# 'setosa'

5.4. Working with Generators and Iterators

5.4.1. Loops with range

  • range(start, stop, step)

  • range(0, 3) will generate (0, 1, 2)

  • start is inclusive, default: 0

  • stop is exclusive, required

  • step default: 1

Listing 18. Loops with range
for number in range(0, 3):
    print(number)

# 0
# 1
# 2
Listing 19. Loops with range
for number in range(4, 11, 2):
    print(number)

# 4
# 6
# 8
# 10

5.4.2. enumerate

  • Pythonic way

  • Preferred over i=0 and i+=1 for every iteration

  • enumerate() will return counter and value for every iteration

Listing 20. enumerate() will return counter and value for every iteration
DATA = ['a', 'b', 'c']

for i, letter in enumerate(DATA):
    print(f'{i} -> {letter}')

# 0 -> a
# 1 -> b
# 2 -> c
Listing 21. enumerate() can start with custom number
DATA = ['a', 'b', 'c']

for i, letter in enumerate(DATA, start=5):
    print(f'{i}, {letter}')

# 5 -> a
# 6 -> b
# 7 -> c

5.5. Example

5.5.1. Create dict from two list

Listing 22. Create dict from two list
keys = ['a', 'b', 'c', 'd']
values = [1, 2, 3, 4]
output = {}

for i, element in enumerate(keys):
    key = keys[i]
    value = values[i]
    output[key] = value

print(output)
# {
#     'a': 1,
#     'b': 2,
#     'c': 3,
#     'd': 4,
# }

5.6. else

  • else will execute, if break was not used to exit the loop

DATA = """
127.0.0.1       localhost
127.0.0.1       astromatt
10.13.37.1      nasa.gov esa.int roscosmos.ru
255.255.255.255 broadcasthost
::1             localhost
"""
DNS = []

for line in DATA.splitlines():
    if not line:
        continue

    ip, *hostnames = line.split()
    # ip == '10.13.37.1'
    # hostnames == ['nasa.gov', 'esa.int', 'roscosmos.ru']

    for record in DNS:
        if record['ip'] == ip:
            record['hostnames'].update(hostnames)
            break
    else:
        DNS.append({
            'hostnames': set(hostnames),
            'ip': ip,
        })

print(DNS)
# [
#   {'ip': '127.0.0.1', 'hostnames': {'astromatt', 'localhost'}},
#   {'ip': '10.13.37.1', 'hostnames': {'roscosmos.ru', 'esa.int', 'nasa.gov'}},
#   {'ip': '255.255.255.255', 'hostnames': {'broadcasthost'}},
#   {'ip': '::1', 'hostnames': {'localhost'}},
# ]

5.7. Assignments

5.7.1. Counter

  1. Dane są liczby na listingu Listing 23.

    Listing 23. Numbers for dict counter
    [1, 4, 6, 7, 4, 4, 4, 5, 1, 7, 0,
     0, 6, 5, 0, 0, 9, 7, 0, 4, 4, 8,
     2, 4, 0, 0, 1, 9, 1, 7, 8, 8, 9,
     1, 3, 5, 6, 8, 2, 8, 1, 3, 9, 5,
     4, 8, 1, 9, 6, 3]
    
  2. Policz ile jest wystąpień każdej z cyfr w tej liście

  3. Zwróć counter: Dict[int, int]

    • klucz - cyfra

    • wartość - ilość wystąpień

The whys and wherefores
  • Definiowanie i korzystanie z dict z wartościami

  • Iterowanie po liście

5.7.2. Segmentation

  1. Dane są liczby na listingu Listing 24.

    Listing 24. Numbers for dict counter
    [1, 4, 6, 7, 4, 4, 4, 5, 1, 7, 0,
     0, 6, 5, 0, 0, 9, 7, 0, 4, 4, 8,
     2, 4, 0, 0, 1, 9, 1, 7, 8, 8, 9,
     1, 3, 5, 6, 8, 2, 8, 1, 3, 9, 5,
     4, 8, 1, 9, 6, 3]
    
  2. Policz ile jest wystąpień każdej z grup w tej liście

    • grupa cyfr małe: cyfry z przedziału [0-2]

    • grupa cyfr średnie: cyfry z przedziału [3-7]

    • grupa cyfr duże: cyfry z przedziału [8-9]

  3. Zwróć counter: Dict[str, int]

    • klucz - grupa

    • wartość - ilość wystąpień

The whys and wherefores
  • Definiowanie i korzystanie z dict z wartościami

  • Iterowanie po liście

5.7.3. Text analysis

  1. Dany jest tekst przemówienia John F. Kennedy'ego "Moon Speech" wygłoszony na Rice Stadium Listing 25.

  2. Zdania oddzielone są kropkami

  3. Każde zdanie oczyść z białych znaków na początku i końcu

  4. Słowa oddzielone są spacjami

  5. Policz ile jest słów w każdym zdaniu

  6. Wypisz na ekranie słownik o strukturze:

    • Dict[str, int]

    • klucz: zdanie

    • wartość: ilość słów

  7. Na końcu wypisz także ile jest łącznie w całym tekście:

    • przysłówków (słów zakończonych na "ly")

    • zdań

    • słów

    • liter

    • znaków (łącznie ze spacjami wewnątrz zdań, ale bez kropek)

The whys and wherefores
  • Dzielenie stringów

  • Sprawdzanie długości ciągów znaków

  • Iterowanie po elementach listy

  • Nazywanie zmiennych

Listing 25. "Moon Speech" by John F. Kennedy, Rice Stadium, Houston, TX, 1962-09-12 [Ken62]
We choose to go to the Moon. We choose to go to the Moon in this decade and do the other things. Not because they are easy, but because they are hard. Because that goal will serve to organize and measure the best of our energies and skills. Because that challenge is one that we are willing to accept. One we are unwilling to postpone. And one we intend to win