5. Iteratory

5.1. Czym jest iterator?

  • __iter__()
  • __next__()
  • raise StopIteration

5.2. Iterowanie po obiektach

5.2.1. Iterowanie po stringu

for znak in 'python':
    print(znak)

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

for liczba in [1, 2, 3, 4]:
    print(liczba)
for key, value in [(0, 0), (1, 1), (1, 2)]:
    print('%s -> %s' % (key, value))
slownik = {'x': 1, 'y': 2}

for key in slownik:
    print(slownik.get(key))

for key, value in slownik.items():
    print(key, value)

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

5.4. itertools

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

5.6. Zadania kontrolne

5.6.1. Range

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

5.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 5.4. 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='Max', nazwisko='Peck', 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)