6. Iteratory

  • Lazy evaluation,

  • Oszczędne pamięciowo,

  • Używane są w wielu miejscach

    • open,

    • zip,

    • enumerate,

    • reversed

from typing import Iterable
print(issubclass(range, Iterable))
True

Hint

Podobnie można sprawdzić inne typy tj. list, string

from typing import Iterable, Iterator

print(isinstance(range(10), Iterable))
print(hasattr(range(10),'__iter__'))
print(callable(range(10).__iter__))
print(isinstance(iter([1,2]) , Iterator))
True
True
True
True

6.1. Iteratoru vs listy

# nie zużywa pamięci - iteruje w locie
for i in ( i ** 2 for i in range(10**8)):
    print(i)
# zużywa dużo pamięci

lista = [ i ** 2 for i in range(10**8)]

Hint

Porównaj procesy dla listy oraz generatora przy użyciu ps aux PID Dodatkowo możesz użyć funckji linuxowej watch -d -n 0.1

6.2. Definiowanie iteratorów

class Numbers:
    def __iter__(self):
        self.value = 1
        return self

    def __next__(self):
        value = self.value
        self.value += 1
        return value

numbers = Numbers()
my_iter = iter(numbers)

print(next(my_iter))
print(next(my_iter))
print(next(my_iter))
1
2
3

6.3. Zip

from typing import Iterable, Iterator

za = zip([1,2,3], ['a', 'b', 'c'])
print(isinstance(za, Iterable))
print(isinstance(za, Iterator))
True
True

6.4. Zadania

6.4.1. Pierwsze

  • Mamy listę wydatki w poszczególnych dniach tygodnia

    • wydatki = [11.25, 18.0, 20.0, 10.75, 9.50]

  • Wypisz (bez użycia range / len) google

    • “Koszt parkingu nr 1: 11.25”

    • “Koszt parkingu nr 2: 18.00”

Hint

Można wykorzystać słowo kluczowe enumerate