07. Итератори и генератори

Преговор

Какво можем с for?

        for x in [1,2,3]: print(x)

        for x in range(42): print(x)

        for x in map(lambda x: 2*x, something): print(x)
    

Итератор

iter и next

Пример

for чрез while

        iterator = iter([1,2,3])
        while True
            x = next(iterator)
            print(x)
    

iter и next (2)

iter и next (3)

Понякога итерираното съвпада с итератора

        >>> m = map(lambda x: x*2, [1,2,3])
        >>> iter(m) is m # True
        True
    

iter и next (4)

В тези случаи можем да викаме направо next

        m = map(lambda x: x * 2, [1,2,3])
        while True
            x = next(m)
            print(x)
    

Въпрос

Какво ще изведе следният код

        numbers = [1,2,3]
        doubled = map(lambda x: x*2, l)
        numbers[1] = 42
        for x in doubled
            print(x)
    

yield e

Пример за yield

        def musicians()
            yield 'Coltrane'
            yield 'Davis'
            yield 'Getz'
    

Това е генератор

Прости числа с генератор

        def primes()
            number = 2
            while True
                if all([number % divisor for divisor in range(2, number)]):
                    yield number
                number += 1
    

Генератори

Генератори

        def biscuits(pack)
            pack.open()
            while not pack.empty()
                biscuit = pack.take_out()
                yield biscuit

        for biscuit in biscuits(favori)
            if biscuit.examine():
                biscuit.eat()
            else
                biscuit.throw_away()
    

Generator expressions

        primes = [n*n for n in range(2, 100)]
        primes = (n*n for n in range(2, 100))
    

вградени функции

any и all

        def endless()
            yield True
            while True
                yield False

        any(endless())
    

enumerate

enumerate (2)

        names = ['Bird', 'Satchmo', 'Trane']
        i = 0
        for x in names
            print(i, x)
            i += 1
    

enumerate (2)

        names = ['Bird', 'Satchmo', 'Trane']
        for i, x in enumerate(names)
            print(i, x)
    

zip

zip (2)

        tracks = ['Take the A Train', 'Mack the Knife', 'Alabama']
        names = ['The Duke', 'Satchmo', 'Trane']
        for track, name in zip(tracks, names)
            print('{0} by {1}'.format(track, name))
    

Модулът itertools

Съдържа помощни функции за работа с итератори

itertools

Още въпроси?