Декораторы · 13 из 16
Штемпель-розетка
Отделение заказало новый штемпель — круглую розетку из лепестков, как на старых марках. Рисовать розетку целиком скучно и долго: лепесток один, его надо повторить по кругу. Зинаида Петровна сказала просто: пусть функция рисует один лепесток, а всё остальное делает обёртка — повторяет, поворачивает и возвращает черепашку на место.
Что сделать
Напишите декоратор с числом: обёрнутая функция рисования повторяется n раз по кругу из одной точки.
Что приходит
n— сколько раз повторить рисунок по кругу, целое от 1
Что вернуть
Декоратор: обёртка рисует n копий с поворотом на 360 / n и возвращает черепашку туда же и так же; имя и описание функции сохраняются.
Допишите функцию po_krugu в редакторе справа.
Рисуйте черепашкой t, как turtle дома, — проверка
сравнивает нарисованное; возвращать ничего не нужно.
с графикой когда тесты пройдут, ответ вашей функции нарисуется · все задачи с графикой
Функция luch(t, dlina) рисует уголок: вперёд, налево 90°, ещё немного вперёд. Под @po_krugu(6) вызов luch(t, 50) рисует шесть таких уголков из одной точки — первый в ту сторону, куда смотрела черепашка, каждый следующий повёрнут налево на 60°. После рисунка черепашка стоит там, где стояла, и смотрит туда же.
po_krugu(n) возвращает декоратор. Он оборачивает функцию рисования — её первый аргумент черепашка t, остальные любые — в обёртку с той же подписью.
Обёртка запоминает, где черепашка стоит и куда смотрит, и n раз: поднимает перо, ставит черепашку в запомненную точку, поворачивает на запомненный курс плюс i · 360 / n градусов (i — номер копии с нуля; плюс — налево), опускает перо и вызывает функцию со всеми её аргументами. Деление обычное, не целое.
В конце черепашка возвращается в запомненную точку с поднятым пером и смотрит на запомненный курс; перо опущено. Обёртка ничего не возвращает. У обёртки те же __name__ и __doc__, что у функции.
Образцовый тест целиком
from cherepashka import risunok as _risunok_p
@po_krugu(6)
def luch(t, dlina):
t.forward(dlina)
t.left(90)
t.forward(dlina / 4)
_risunok_p(luch, 50)
<рисунок: 9 линий, 1 цвет; от (-50, -49.55) до (50, 49.55); отпечаток c31207be0a>
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.