Итераторы
Итераторы вокруг нас
Вычислимые последовательности.
Как задать самому? Например, циклической сборкой, см. пример выше
iterator object, next(), StopIteration
протокол последовательности: методы .__getitem__() или .__iter__()
iter() от всего подряд
⇒ работа цикла for: сделать итератор и по нему ходить
Генераторы
Создание и использование генератора, (yield ⇒ функция, возвращающая генератор, а уж генератор yield-ит результаты)
Пример работы, return в генераторе
- Генератор — «одноразовая» последовательность
Параметрические генераторы
В генератор можно затолкать значение на каждом обороте (оно прочтётся yield-ом).
1 >>> def biased(init):
2 ... bias = yield init
3 ... while bias:
4 ... init += bias*2+1
5 ... bias = yield init
6 ...
7 >>> g = biased(10)
8 >>> next(g) # или, что то же самое, g.send(None)
9 10
10 >>> g.send(5)
11 21
12 >>> g.send(5)
13 32
14 >>> g.send(-1)
15 31
16 >>> g.send(100500)
17 201032
18 >>> g.send(0)
19 Traceback (most recent call last):
20 File "<stdin>", line 1, in <module>
21 StopIteration
Первый вызов — только next() (ещё ничего не передали), остальные — .send()
при этом next() означает .send(None)
Зачем это может быть нужно??
- асинхронные возможности
Itertools (сколько успеем)
Бесконечные последовательности и частичные вычисления, itertools
- Обработка вычислимых последовательностей
- функциональное программирование
- Обзор
- Бесконечные последовательности
- Модификация последовательностей
- Комбинаторика
Д/З
- Прочитать
Про итераторы и генераторы в учебнике
Про итераторы и генераторы в справочеике
TODO