6.2. Loop For

6.2.1. Syntax

  • ITERABLE must implement iterator interface

  • More information in Iterators

Listing 6.10. for loop syntax
for <variable> in <iterable> :
    <do something>

6.2.2. Convention

  • The longer the loop scope, the longer the variable name should be

  • Avoid one letters if scope is longer than one line

  • Prefer locally meaningfull name over generic names

  • Generic names:

    • obj - generic name (in Python everything is an object)

    • element - generic name

    • item - generic name

    • e - bad, if scope is more than one line

    • l - bad, for letter

    • o - bad

    • d - for digit

  • Locally meaningfull name:

    • letter

    • feature

    • digit

    • person

    • color

    • username

    • etc.

  • Special meaning:

    • i - for loop counter

6.2.3. Iterating Sequences

Listing 6.11. Iterating over str will get character on each iteration
for obj in 'setosa':
    print(obj)

# s
# e
# t
# o
# s
# a
Listing 6.12. Iterating over list will get one element on each iteration
DATA = [5.1, 3.5, 1.4, 0.2, 'setosa']

for obj in DATA:
    print(obj)

# 5.1
# 3.5
# 1.4
# 0.2
# 'setosa'
Listing 6.13. Iterating over tuple will get one element on each iteration
DATA = (5.1, 3.5, 1.4, 0.2, 'setosa')

for obj in DATA:
    print(obj)

# 5.1
# 3.5
# 1.4
# 0.2
# 'setosa'
Listing 6.14. Iterating over set will get one element on each iteration
DATA = {5.1, 3.5, 1.4, 0.2, 'setosa'}

for obj in DATA:
    print(obj)

# 5.1
# 3.5
# 1.4
# 0.2
# 'setosa'
Listing 6.15. Iterating over frozenset will get one element on each iteration
DATA = frozenset({5.1, 3.5, 1.4, 0.2, 'setosa'})

for obj in DATA:
    print(obj)

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

6.2.4. 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 6.16. Loops with range
for number in range(0, 3):
    print(number)

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

# 4
# 6
# 8
# 10

6.2.5. Enumerate

  • Pythonic way

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

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

DATA = ['a', 'b', 'c']

for letter in DATA:
    print(letter)

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

for i, letter in enumerate(DATA):
    print(i, letter)

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

for i, letter in enumerate(DATA, start=5):
    print(i, letter)

# 5 a
# 6 b
# 7 c

6.2.6. Assignments

6.2.6.1. Example

English
  1. Use data from "Input" section (see below)

  2. Count occurrences of each color

  3. Compare results with "Output" section below

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Zlicz wystąpienia każdego z kolorów

  3. Porównaj wynik z sekcją "Output" poniżej

Input
DATA = ['red', 'green', 'blue', 'red', 'green', 'red', 'blue']
Output
result: Dict[str, int]
# {'red': 3, 'green': 2, 'blue': 2}
Solution
DATA = ['red', 'green', 'blue', 'red', 'green', 'red', 'blue']

result = {}

for color in DATA:
    if color not in result:
        result[color] = 1
    else:
        result[color] += 1

print(result)
# {'red': 3, 'green': 2, 'blue': 2}

6.2.6.2. Loop For Counter

English
  1. Use data from "Input" section (see below)

  2. Iterate over DATA

  3. Count occurrences of each number

  4. Create empty result: Dict[int, int]:

    • key - digit

    • value - number of occurrences

  5. Iterating over numbers check if number is already in result

    • If first occurrence, then add it to result with value 1

    • If exists, then increment the value by 1

  6. Compare results with "Output" section below

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Iteruj po DATA

  3. Policz wystąpienia każdej z cyfr

  4. Stwórz pusty result: Dict[int, int]:

    • klucz - cyfra

    • wartość - liczba wystąpień

  5. Iterując po cyfrach sprawdź czy cyfra znajduje się już w result

    • Jeżeli pierwsze wystąpienie, to dodaj ją do result z wartością 1

    • Jeżeli istnieje, to zwiększ w wartość o 1

  6. Porównaj wynik z sekcją "Output" poniżej

Input
DATA = [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]
Output
result: Dict[int, int]
# {1: 7, 4: 8, 6: 4, 7: 4, 5: 4, 0: 7, 9: 5, 8: 6, 2: 2, 3: 3}
The whys and wherefores
  • Defining dict Mapping Dict

  • Updating dict

  • Iterating over sequences

6.2.6.3. Loop For Segmentation

English
  1. Use data from "Input" section (see below)

  2. Count occurrences of each group

  3. Define groups:

    • small - numbers in range [0-3)

    • medium - numbers in range [3-7)

    • large - numbers in range [8-9]

  4. Print result: Dict[str, int]:

    • key - group

    • value - number of occurrences

  5. Compare results with "Output" section below

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Policz wystąpienia każdej z group

  3. Zdefiniuj grupy

    • small - liczby z przedziału <0-3)

    • medium - liczby z przedziału <3-7)

    • large - liczby z przedziału <7-9>

  4. Wypisz result: Dict[str, int]:

    • klucz - grupa

    • wartość - liczba wystąpień

  5. Porównaj wynik z sekcją "Output" poniżej

Input
DATA = [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]
Output
from typing import Dict

result: Dict[str, int]
# {'small': 16, 'medium': 19, 'large': 15}
The whys and wherefores
  • Defining dict

  • Updating dict

  • Iterating over sequences

6.2.6.4. Loop For Newline

English
  1. Use data from "Input" section (see below)

  2. Define result: str

  3. Use for to iterate over DATA

  4. Join lines of text with newline (\n) character

  5. Do not use str.join()

  6. Compare result with "Output" section (see below)

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Zdefiniuj result: str

  3. Użyj for do iterowania po DATA

  4. Połącz linie tekstu znakiem końca linii (\n)

  5. Nie używaj str.join()

  6. Porównaj wyniki z sekcją "Output" (patrz poniżej)

Innput
DATA = [
    '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.']
Output
result: str
# 'We choose to go to the Moon.\nWe choose to go to the Moon in this decade and do the other things.\nNot because they are easy, but because they are hard.'

6.2.6.5. Loop For Substitute

English
  1. Use data from "Input" section (see below)

  2. Define result: list

  3. Use for to iterate over DATA

  4. If letter is in PL_ASCII then use conversion value as letter

  5. Add letter to result

  6. Compare result with "Output" section (see below)

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Użyj for do iteracji po DATA

  3. Jeżeli litera jest w PL_ASCII to użyj przekonwertowanej wartości jako litera

  4. Dodaj literę do result

  5. Porównaj wyniki z sekcją "Output" (patrz poniżej)

Input
PL_TO_ASCII = {
    'ą': 'a',
    'ć': 'c',
    'ę': 'e',
    'ł': 'l',
    'ń': 'n',
    'ó': 'o',
    'ś': 's',
    'ż': 'z',
    'ź': 'z',
}

DATA = 'zażółć gęślą jaźń'
Output
result: str
# 'zazolc gesla jazn'

6.2.6.6. Loop For Text

  • Complexity level: medium or hard

  • Lines of code to write: 30 lines

  • Estimated time of completion: 15 min

  • Solution: solution/loop_for_text.py

English
  1. Use data from "Input" section (see below)

  2. Given is text of the "Moon Speech" by John F. Kennedy's [F1]

  3. Sentences are separated by period (.)

  4. Clean each sentence from whitespaces at the beginning and at the end

  5. Words are separated by spaces

  6. Print the total number in whole text:

    • adverbs (words ending with "ly")

    • sentences

    • words

    • letters

    • characters (including spaces inside sentences, but without periods .)

    • comas (,)

  7. Compare results with "Output" section below

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Dany jest tekst przemówienia "Moon Speech" wygłoszonej przez John F. Kennedy'ego [F1]

  3. Zdania oddzielone są kropkami (.)

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

  5. Słowa oddzielone są spacjami

  6. 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 .)

    • przecinków (,)

  7. Porównaj wynik z sekcją "Output" poniżej

Input
Listing 6.20. "Moon Speech" by John F. Kennedy, Rice Stadium, Houston, TX, 1962-09-12 [F1]
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
Output
Sentences: 7
Words: 71
Characters: 347
Letters: 283
Commas: 1
Adverbs: 0
The whys and wherefores
  • String splitting

  • Calculating lengths

  • Iterating over string

  • Naming convention

  • Good variable names