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 oraz readline

  • 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