Декораторы · 14 из 17
Сглаживание краёв
Для экрана в зале ожидания отделения нарисовали заставку — зонную пластинку, концентрические кольца, которые к краю становятся всё тоньше. На экране она вышла странной: у краёв вместо тонких колец поплыли чужие узоры, «муар», а гладкие дуги стали лесенками. Беда в том, что каждую точку экрана красят по одному значению в её центре. Зинаида Петровна вспомнила старый приём: спросить картинку в нескольких местах внутри точки и взять среднее. Рисующих функций у отделения много, и переписывать каждую не хочется — нужен декоратор.
Что сделать
Напишите декоратор с параметрами: функция точки f(x, y) должна возвращать среднее из n × n замеров внутри клетки.
Что приходит
shag— размер клетки экрана по каждой осиn— сколько замеров по каждой оси
Что вернуть
Декоратор: обёрнутая функция (x, y) отдаёт среднее из n·n значений f и сохраняет имя f.
Допишите функцию sgladit в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
с графикой когда тесты пройдут, ответ вашей функции нарисуется · все задачи с графикой
Функция kray даёт 1 правее нуля и 0 левее. С @sgladit(1, 2) точка (0, 5) спрашивает её в x = −0,25 и x = +0,25 (и в двух y): два нуля и две единицы — kray(0, 5) даёт 0.5, ровно половину.
sgladit(shag, n) возвращает декоратор. Декоратор оборачивает функцию f(x, y) и возвращает функцию (x, y), которая:
- зовёт
fровноn · nраз — в точках(x + dx, y + dy), гдеdxиdyпробегают значения((i + 0.5) / n − 0.5) · shagдляi = 0, 1, …, n − 1. Приn = 2иshag = 1это −0,25 и +0,25: замеры стоят равномерно внутри клетки, по центрам её долек; - возвращает среднее арифметическое этих значений — дробное число.
Обёрнутая функция сохраняет имя и строку документации исходной (functools.wraps). Сравнение ответов — с точностью до миллионных.
Образцовый тест целиком
@sgladit(1, 2)
def kray(x, y):
return 1 if x > 0 else 0
kray(0, 5)
0.5
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.