4354
Комментарий:
|
4497
|
Удаления помечены так. | Добавления помечены так. |
Строка 62: | Строка 62: |
Тестирующая программа будет либо считать ровно секунду и замерять точность, либо считать с заданной точностью, либо брать заданное количество элементов этого итератора. | * Тестирующая программа будет либо считать ровно секунду и замерять точность, либо считать с заданной точностью, либо брать заданное количество элементов этого итератора. * [[http://newton.ex.ac.uk/research/qsystems/collabs/pi/|Много цифр Пи]], поднадобитя не больше 40000 ☺ |
Итераторы
Итераторы вокруг нас
Вычислимые последовательности.
Как задать самому? Например, циклической сборкой, см. пример выше
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
<<EJCMC(148, ChudnPi, Много знаков Пи)>>
Написать бесконечный итератор PiGen(), вычисляющий Decimal представление числа Пи по алгоритму Чудновских (согласно английской Википедии их там было боле одного): $$ \frac{(640320)^{3/2}}{12\pi}=\frac{426880\sqrt{10005}}{\pi} = \sum_{k=0}^{\infty} \frac{(6k)! (545140134k + 13591409)}{(3k)!(k!)^3 (-262537412640768000)^{k}} $$
- Тестирующая программа будет либо считать ровно секунду и замерять точность, либо считать с заданной точностью, либо брать заданное количество элементов этого итератора.
Много цифр Пи, поднадобитя не больше 40000 ☺
<<EJCMC(148, VirtualTurtle, Примитивная черепашка)>>
Написать параметрический генератор turtle(coord, direction), описывающий движение «черепахи» по координатной плоскости. coord — это кортеж из двух целочисленных начальных координат, direction описывает первоначальное направление (0 — восток, 1 — север, 2 — запад, 3 — юг). Координаты увеличиваются на северо-восток. Генератор принимает три команды — "f" (переход на 1 шаг вперёд), "l" (поворот против часовой стрелки на 90°) и "r" (поворот по часовой стрелке на 90°) и возвращает текущие координаты черепахи.
1 0 1 0 1 1 1 1 2 1 3 1 3 1 3 0 3 -1 3 -1
Написать итератор YinYang(Seq,,1,,, …, Seq,,n,, …), которая получает на вход конечное количество (возможно, бесконечных) числовых последовательностей, а возвращает сначала все чётные элементы этих последовательностей, а затем нечётные. Например, YinYang([1,2,3], [6,5,4,3]) вернёт 2 … 6 … 4 … 1 … 3 … 5 … 3