7. Generatory¶
Lazy evaluation,
Oszczędne pamięciowo
import collections, types
print(issubclass(types.GeneratorType, collections.Iterator))
True
Note
Generator jest Iteratorem, lecz Iterator nie jest Generatorem !
7.1. Wyrażenie jako generator¶
g = (n for n in range(20) if not n % 2) # tylko parzyste !
for x in g:
print(x)
7.2. Funkcja jako generator¶
def simple_gen():
yield 5
yield 10
yield 15
s = simple_gen()
print(next(s))
print(next(s))
print(next(s))
5
10
15
# już nie ma elementów aby przeiterować
print(next(s))
StopIteration:
def new_range(start=0, stop=None, step=1):
i = start
if stop is None:
while True:
yield i
i += step
else:
while i < stop:
yield i
i += step
g = new_range(2, 5)
print(next(g))
print(next(g))
2
3
Note
Generatory to funkcje produkujace kolejne wartosci. Gdy iteratory to obiekty używające metody next()
7.3. Zadania¶
7.3.1. Pierwsze¶
Utwórz generator, który generuje wartości będące 3 krotnością wartości od 0 do 20
7.3.2. Trzecie¶
Wykorzystując plik z zadnia z list comprehension
Ściągnij plik przy użyciu pythona
Hint
Można użyć biblioteki:
urllib
Można użyć domyślnej funcki
open
orazreadline
Oczyść plik,
Napisz generator konwertujący datę w tekscie na format datowy
Jako, że w trakcie generowania logów mieliśmy źle ustawiony zegar - musimy dodać jedną godzinę
Hint
W pakiecie datetime
jest timedelta