16. Iteratory

16.1. Czym jest iterator?

  • __iter__()
  • __next__()
  • raise StopIteration

16.2. Iterowanie po obiektach

16.2.1. Iterowanie po stringu

for character in 'hello':
    print(character)

# h
# e
# l
# l
# o

16.2.2. Iterowanie po list(), dict(), set(), tuple()

for liczba in [1, 2, 3, 4]:
    print(liczba)
for key, value in [('a',1), ('b',2), ('c',3)]:
    print(f'{key} -> {value}')

# a -> 1
# b -> 2
# c -> 3
my_dict = {'a': 1, 'b': 2, 'c': 3}

for key in my_dict:
    value = my_dict.get(key)
    print(value)

# 1
# 2
# 3


for key, value in my_dict.items():
    print(f'{key} -> {value}')

# a -> 1
# b -> 2
# c -> 3

16.3. Własny iterator

class ListaFigurGeometrycznych:
    lista = []
    aktualny_elemtent = 0

    def __iter__(self):
        self.aktualny_elemtent = 0
        return self

    def push(self, figura):
        self.lista.append(figura)

    def __next__(self):
        if self.aktualny_elemtent >= len(self.lista):
            raise StopIteration

        element = self.lista[self.aktualny_elemtent]
        self.aktualny_elemtent += 1
        return element


figury = ListaFigurGeometrycznych()

figury.push('kwadrat')
figury.push('prostokat')
figury.push('trojkat')

for figura in figury:
    print(figura)

16.4. itertools

16.5. Przykład

def parzyste_f4():
    for x in range(0, 30):
        if x % 2 == 0:
            yield float(x)


print(parzyste_f4())
a = parzyste_f4()

try:
    print('next1', a.__next__())
    print('next2', a.__next__())
    print('next3', a.__next__())
    print('next4', a.__next__())
except StopIteration:
    pass


for liczba in parzyste_f4():
    print(liczba)

16.6. Assignments

16.6.1. Range

  1. Zaimplementuj własne rozwiązanie range() wykorzystując iterator.
  2. Początek, koniec, krok (step)

16.6.2. Książka adresowa

  1. spraw aby można było iterować w książce adresowej z poprzednich zadań po adresach użytkownika.
Code Listing 16.3. Struktury danych książki adresowej
class Kontakt:
    def __init__(self, imie, nazwisko, adresy=[]):
        self.imie = imie
        self.nazwisko = nazwisko
        self.adresy = adresy


class Adres:
    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)


kontakt = Kontakt(imie='Matt', nazwisko='Kowalski', adresy=[
    Adres(ulica='2101 E NASA Pkwy', miasto='Houston', stan='Texas',
          kod='77058', panstwo='USA'),
    Adres(ulica=None, miasto='Kennedy Space Center', kod='32899',
          panstwo='USA'),
    Adres(ulica='4800 Oak Grove Dr', miasto='Pasadena', kod='91109',
          panstwo='USA'),
    Adres(ulica='2825 E Ave P', miasto='Palmdale', stan='California',
          kod='93550', panstwo='USA'),
])

for adres in kontakt:
    print(adres)