Параметрические итераторы
Множества и словари (практическая часть)
TODO
- Словари при распаковке/запаковке именных параметров
- Словари в пространствах имён
Параметрические итераторы
В итератор можно затолкать значение на каждом обороте (оно прочтётся 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)
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)
Зачем это может быть нужно??
Декораторы
Что, если мы хотим «обмазать» все вызовы некоторой функции отладочной информацией?
Неудобно! Поиск с заменой fun(a,b) на dfun(fun,a,b).
Создадим обёрнутую функцию вместо старой:
Всё равно поиск с заменой, хотя и попроще. Тогда просто перебьём имя fun!
Вот это и есть декоратор, записывается так:
Закомментировали @genf — убрали декоратор!
(Не успели — параметрические декораторы)
Замыкание
Что не так в этом коде?
А то не так, что это вот «c» функция fun() берёт не из глобального пространства имён, а из объемлющего. И оно там залипает, несмотря на то, что должно было бы удалиться при выходе из функции addN(). Такие имена помещаются в замыкание (closure):
Т. е. содержимое таинственной «ячейки» — это как раз объект 20.
Д/З
TODO где почитать про декораторы и параметрические итераторы?
EJudge: ToInt 'Вещественные в целые'
Написать функцию-декоратор toint(function), которая модифицирует произвольную (для простоты — не имеющую именных параметров) функцию, заменяя с помощью int() все её вещественные параметры, а также возвращаемое значение, целыми. Параметры и/или возвращаемое значение другого типа не меняются.
3
EJudge: 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
EJudge: DoPolIZ 'Обратная польская запись'
(Чуть усложнённая MCCME). В постфиксной записи (или обратной польской записи) операция записывается после двух операндов. Например, сумма двух чисел A и B записывается как A B +. Запись B C + D * обозначает привычное нам (B + C) * D, а запись A B C + D * + означает A + (B + C) * D. Дано выражение в постфиксной записи, содержащее целые десятичные числа, операции +, – и *, а также слова, не являющиеся целыми числами и вышеуказанными операциями. Удалите все незнакомые слова из строки и вычислите значение полученного выражения (вещественные числа также не являются целыми, их тоже надо удалять). Стек при вычислении выражения гарантированно заполнен, но не обязательно до конца опустошается (в примере ниже он содержит два значения).
100500 8 33e 9 + @ -44f4 -- 1 1.1 7 - * -10 -
-92