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