Напишите декоратор, оптимизирующий работу декорируемой функции. Декоратор должен сохранять результат работы функции на ближайшие три запуска и вместо выполнения функции возвращать сохранённый результат. После трёх запусков функция должна вызываться вновь, а результат работы функции — вновь кешироваться.
Подсказка:
Создайте в декораторе переменную-кеш, сохраните в ней результат выполнения декорируемой функции. Создайте в декораторе переменную, хранящую счётчик запросов. Пока значение счётчика ниже предельного — отдавайте результат, сохранённый в кеше. Когда число запросов к функции превысит предел и пора будет снова высчитывать результат выполнения функции — сбросьте счётчик, выполните декорируемую функцию и заново сохраните результат её выполнения в переменную-кеш.
Код:
def cache3(func): counter = 0 result = func() def wrapper(): nonlocal counter counter += 1 if counter<=3: return result else: counter = 1 return func() return wrapper @cache3 def heavy(): print('Сложные вычисления') return 1 print(heavy()) # Сложные вычисления # 1 print(heavy()) # 1 print(heavy()) # 1 # Опять кеш устарел, надо вычислять заново print(heavy()) # Сложные вычисления # 1