Различия между версиями 2 и 3
Версия 2 от 2020-10-20 22:51:56
Размер: 2949
Редактор: FrBrGeorge
Комментарий:
Версия 3 от 2020-10-21 00:11:33
Размер: 4365
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 59: Строка 59:
## * <<EJCMC(148, )>>
## * <<EJCMC(148, VirtualTurtle, Примитивная черепашка)>>
  * <<EJCMC(148, VirtualTurtle, Примитивная черепашка)>>
  * `<<EJCMC(148, ChudnPi, Много знаков Пи)>>`
   * Написать бесконечный итератор `PiGen()`, вычисляющий Decimal представление числа Пи по [[RW:Алгоритм_Чудновского|алгоритму Чудновских]] (согласно [[WP:Chudnovsky_algorithm|английской Википедии]] их там было боле одного):
   $$ \frac{(640320)^{3/2}}{12\pi}=\frac{426880\sqrt{10005}}{\pi} = \sum_{k=0}^{\infty} \frac{(6k)! (545140134k + 13591409)}{(3k)!(k!)^3 \left(-262537412640768000\right)^{k}} $$
    Тестирующая программа будет либо считать ровно секунду и замерять точность, либо считать с заданной точностью, либо брать заданное количество элементов этого итератора.
  * `<<EJCMC(148, VirtualTurtle, Примитивная черепашка)>>`
  <<Include(LecturesCMC/PythonIntro2019/Homework_VirtualTurtle)>>
  * Написать итератор `YinYang(Seq,,1,,, …, Seq,,n,, …)`, которая получает на вход конечное количество (возможно, бесконечных) числовых последовательностей, а возвращает сначала все чётные элементы этих последовательностей, а затем нечётные. Например, `YinYang([1,2,3], [6,5,4,3])` вернёт `2 … 6 … 4 … 1 … 3 … 5 … 3`

Итераторы

Итераторы вокруг нас

Вычислимые последовательности.

  • Как задать самому? Например, циклической сборкой, см. пример выше :)

  • iterator object, next(), StopIteration

  • протокол последовательности: методы .__getitem__() или .__iter__()

    • iter() от всего подряд

    • ⇒ работа цикла for: сделать итератор и по нему ходить

Генераторы

  • Создание и использование генератора, (yield ⇒ функция, возвращающая генератор, а уж генератор yield-ит результаты)

    • Пример работы, return в генераторе

    • Генератор — «одноразовая» последовательность
    • yield from

Параметрические генераторы

В генератор можно затолкать значение на каждом обороте (оно прочтётся 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

  • Обработка вычислимых последовательностей
  • функциональное программирование
  • Обзор
    • Бесконечные последовательности
    • Модификация последовательностей
    • Комбинаторика

Д/З

  1. Прочитать

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 \left(-262537412640768000\right)^{k}} $$

      • Тестирующая программа будет либо считать ровно секунду и замерять точность, либо считать с заданной точностью, либо брать заданное количество элементов этого итератора.
  • <<EJCMC(148, VirtualTurtle, Примитивная черепашка)>>

    Написать параметрический генератор turtle(coord, direction), описывающий движение «черепахи» по координатной плоскости. coord — это кортеж из двух целочисленных начальных координат, direction описывает первоначальное направление (0 — восток, 1 — север, 2 — запад, 3 — юг). Координаты увеличиваются на северо-восток. Генератор принимает три команды — "f" (переход на 1 шаг вперёд), "l" (поворот против часовой стрелки на 90°) и "r" (поворот по часовой стрелке на 90°) и возвращает текущие координаты черепахи.

       1 robo = turtle((0,0),0)
       2 start = next(robo)
       3 for c in "flfrffrffr":
       4     print(*robo.send(c))
    

    1 0
    1 0
    1 1
    1 1
    2 1
    3 1
    3 1
    3 0
    3 -1
    3 -1


    CategoryHomework

  • Написать итератор YinYang(Seq,,1,,, …, Seq,,n,, …), которая получает на вход конечное количество (возможно, бесконечных) числовых последовательностей, а возвращает сначала все чётные элементы этих последовательностей, а затем нечётные. Например, YinYang([1,2,3], [6,5,4,3]) вернёт 2 … 6 … 4 … 1 … 3 … 5 … 3

LecturesCMC/PythonIntro2020/07_Iterators (последним исправлял пользователь FrBrGeorge 2020-10-21 19:47:11)