Декораторы · 10 из 14
Память с очисткой
Задействованы также: Словари
Справка о тарифе идёт в общую базу и возвращается через раз по полсекунды. За день одни и те же вопросы повторяются десятками, а после смены тарифов запомненное надо выкинуть — иначе отделение месяц будет считать по-старому.
Что сделать
Запоминайте ответы справки о тарифе — и умейте всё забыть, когда тарифы сменились.
Что приходит
rabota— функция с любыми аргументами
Что вернуть
Обёртку: помнит ответы по аргументам — порядок именованных не важен, — считает popadaniya и promahi, метод ochistit() забывает всё и обнуляет оба; имя сохраняется.
Допишите функцию zapominat в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
tarif(2000), ещё раз tarif(2000), tarif(3000) и снова tarif(2000). Настоящий тариф посчитан дважды — [2000, 3000], из памяти — тоже два ответа: попаданий 2, промахов 2.
Функция принимает другую функцию и возвращает обёртку.
Обёртка принимает любые аргументы — позиционные и именованные, — и запоминает результат по ним. При повторе с теми же аргументами исходная функция не вызывается, отдаётся запомненное. Именованные аргументы, переданные в разном порядке, считаются теми же самыми. Обёртка ведёт два счётчика: «popadaniya» — сколько раз ответ нашёлся в памяти, «promahi» — сколько раз пришлось звать исходную функцию. Метод «ochistit()» забывает всё запомненное и обнуляет оба счётчика. Имя исходной функции сохраняется.
Образцовый тест целиком
vyzovy = []
@zapominat
def tarif(gramm):
vyzovy.append(gramm)
return gramm // 1000 * 100
tarif(2000)
tarif(2000)
tarif(3000)
(tarif(2000), vyzovy, tarif.popadaniya, tarif.promahi)
(200, [2000, 3000], 2, 2)
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.