Top.Mail.Ru
Ответы
Аватар пользователя
9 месяцев назад
от

Помогите мне пожалуйста решить задачу на Питоне! Точнее исправить задачу!

Вот само задание:

Задача 5. Кэширование для ускорения вычислений
Контекст
Вы разрабатываете программу для оптимизации вычислений чисел Фибоначчи. Числа Фибоначчи вычисляются рекурсивной функцией, каждое число равно сумме двух предыдущих чисел. Однако вы заметили, что при больших значениях чисел Фибоначчи вычисления занимают значительное время, так как многие значения вычисляются повторно. Вам поручено создать декоратор, который кэширует результаты вызова функции и позволяет избежать повторных вычислений для одних и тех же аргументов.

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

Примените его к рекурсивной функции вычисления чисел Фибоначчи.

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

Советы
Для хранения результатов удобно использовать словарь, так как поиск элементов внутри словаря будет иметь сложность, равную в среднем O(1).
При этом не стоит хранить все вычисления в одном словаре, созданном снаружи функций (в глобальной области видимости). Лучше создавать отдельные словари для каждой декорируемой функции.

Вот код, который я написал:

import functools
from typing import Callable, Any

def how_are_you(func: Callable):
@functools.wraps(func)
def wrap(*args, **kwargs) -> Any:
inp = input('Как дела? ')
print('А у меня не очень! Ладно, держи свою функцию.')
func(*args, **kwargs)# TODO тут надо же вернуть результат, то есть добавить return и в других заданиях тоже
return wrap

@how_are_you
def test(a: int, b: int) -> None:
print('<Тут что-то происходит...>')
print(a + b)

test(10, 45)
__________

Вот что сказали надо исправить:

Надо вернуть результат выполнения ф-ии, посмотрите ещё раз, как пишется классический декоратор


Помогите мне пожалуйста переделать мой код! Я просто не успеваю это сделать!

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Мыслитель
9мес
1234567891011121314151617181920
 import functools 
from typing import Callable, Any 
 
def how_are_you(func: Callable): 
  @functools.wraps(func) 
  def wrap(*args, **kwargs) -> Any: 
    inp = input('Как дела? ') 
    print('А у меня не очень! Ладно, держи свою функцию.') 
    result = func(*args, **kwargs)  
    return result  
  return wrap 
 
@how_are_you 
def test(a: int, b: int) -> None: 
  print('<Тут что-то происходит...>') 
  print(a + b) 
  return a + b 
 
result = test(10, 45) 
print(result)  
Аватар пользователя
Оракул
9мес
12345678910111213141516171819
 import functools 
from typing import Callable, Any 
 
def how_are_you(func: Callable): 
    @functools.wraps(func) 
    def wrapper(*args, **kwargs) -> Any: 
        inp = input('Как дела? ') 
        print('А у меня не очень! Ладно, держи свою функцию.') 
        result = func(*args, **kwargs) 
        return result 
    return wrapper 
 
@how_are_you 
def test(a: int, b: int) -> int: 
    print('<Тут что-то происходит...>') 
    return a + b 
 
result = test(10, 45) 
print(f"Результат: {result}")