Напишите декоратор, оптимизирующий работу декорируемой функции. Декоратор должен сохранять результат работы функции на ближайшие три запуска и вместо выполнения функции возвращать сохранённый результат. После трёх запусков функция должна вызываться вновь, а результат работы функции — вновь кешироваться.
Подсказка:
Создайте в декораторе переменную-кеш, сохраните в ней результат выполнения декорируемой функции. Создайте в декораторе переменную, хранящую счётчик запросов. Пока значение счётчика ниже предельного — отдавайте результат, сохранённый в кеше. Когда число запросов к функции превысит предел и пора будет снова высчитывать результат выполнения функции — сбросьте счётчик, выполните декорируемую функцию и заново сохраните результат её выполнения в переменную-кеш.
Код:
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