Декоратор для мемоизации в Python

Этот декоратор сохраняет результаты вызова функции с определёнными аргументами, что особенно полезно для затратных вычислений или рекурсивных алгоритмов. Если функция вызывается повторно с теми же параметрами, возвращается закэшированный результат.

def memoize(func):
    """
    Декоратор для кэширования результатов функции.
    """
    cache = {}
    def wrapper(*args, **kwargs):
        # Формируем ключ на основе позиционных и именованных аргументов
        key = (args, tuple(sorted(kwargs.items())))
        if key in cache:
            return cache[key]
        result = func(*args, **kwargs)
        cache[key] = result
        return result
    return wrapper

# Пример использования:
@memoize
def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n - 1)

if __name__ == "__main__":
    print("Факториал 5:", factorial(5))
    print("Факториал 6:", factorial(6))  # Повторное использование кэша для factorial(5)