Модуль 7.14 (Декораторы).
Напишите декоратор
text_decor
, который оборачивает вызов декорированной функции фразами «Hello» и «Goodbye!»: фраза «Hello» печатается до вызова, фраза «Goodbye!» — после@text_decor def simple_func(): print('I just simple python func') simple_func() # Вывод Hello I just simple python func Goodbye!@text_decor def multiply(num1, num2): print(num1 * num2) multiply(3, 5) # Вывод Hello 15 Goodbye!Ваша задача написать только определение функции декоратора
text_decor
def text_decor(func): # объявляем функцию - декоратор def inner(*args, **kwargs): # внутренняя функция print('Hello') # печатаем hello func(*args, **kwargs) # вызываем переданную функцию в декоратор print('Goodbye!') # печатаем goodbye return inner # возвращаем результат
Напишите декоратор
repeater
, который дважды вызывает декорированную функцию@repeater def multiply(num1, num2): print(num1 * num2) multiply(2, 7) # после этого распечатается две строки со значением 14 multiply(5, 3) # после этого распечатается две строки со значением 15Ваша задача написать только определение функции декоратора
repeater
def repeater(func): # объявляем функцию - декоратор def inner(*args, **kwargs): # объявляем внутреннюю функцию func(*args, **kwargs) # вызываем функцию переданную в декоратор func(*args, **kwargs) # вызываем функцию второй раз переданную в декоратор return inner # возвращаем результат
Напишите декоратор
double_it
, который возвращает удвоенный результат вызова декорированной функции@double_it def multiply(num1, num2): return num1 * num2 res = multiply(9, 4) # произведение 9*4=36, но декоратор double_it удваивает это значение print(res)@double_it def get_sum(*args): return sum(args) res = get_sum(1, 2, 3, 4, 5) print(res) # печатает 30Ваша задача написать только определение функции декоратора
double_it
def double_it(func): # объявляем декоратор def inner(*args, **kwargs): # объявляем внутреннюю функцию return func(*args, **kwargs) * 2 # из неё возвращаем удвоенный результат во внешнюю функцию return inner # возвращаем итоговый результат
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы
Декоратор-запоминаторДавайте вспомним рекурсивную функцию Фибоначчи
Проблема работы этой функции в том, что она постоянно будет вызывать одни и те же значения, что будет сказываться на скорости работы. Если вызвать ее от десяти
то она быстро завершит работу и вернет результат. Но попробуйте дождаться завершения если вызовете от сорока
Дождаться пока функция найдет сотое число Фибоначчи будет нереально. Но мы можем придумать декоратор, который будет запоминать в себе аргументы функции и возвращаемые значения. Для этого нужно воспользоваться мемоизацией
В этом задании вам нужно определить декоратор
memoize
, который принимает функцию в качестве аргумента и возвращает функцию-оболочку. Функция-оболочка проверяет, были ли входные данные для функции просмотрены ранее и сохранены ли они в кеше. Если это так, функция просто возвращает кэшированный результат. Если нет, она вызывает исходную функцию и сохраняет результат в кеше для использования в будущем. Кеш представляет собой хранилище ранее вычиленных значений, в нашем случае можно использовать словарьЗатем мы применяем этот декоратор к рекурсивной функции
fibonacci
. Когда функцияfibonacci
вызывается с определенным входным значением, логика мемоизации проверяет, был ли результат уже рассчитан и сохранен в кеше. Если был, кэшированный результат возвращается немедленно. Если нет, то будет вызвана функцияfibonacci
для вычисления результата, и результат будет сохранен в кеше для использования в будущем.Ваша задача реализовать декоратор
memoize
, который помимо выше описанного еще и должен сохранить первоначальное имя декорируемой функцию и ее строку документацииSample Input:
Sample Output:
from functools import wraps
def memoize(func: callable) -> callable:
«»»Cache-making decorator»»»
cache = {}
@wraps(func)
def cache_check(*args,**kwargs):
for i in args:
if i not in cache.keys():
cache[i] = func(i)
return func(i)
else: return cache[i]
return cache_check
# Напишите определение декоратора validate_args
from functools import wraps
def validate_args(func):
@wraps(func)
def inner(*args):
if len(args) < 2:
return ‘Not enough arguments’
if len(args) > 2:
return ‘Too many arguments’
if type(args[0]) != int or type(args[1]) != int:
return ‘Wrong types’
else:
return func(*args)
#return func
return inner
# Код ниже не удаляйте, он нужен для проверки
@validate_args
def add_numbers(x, y):
«»»Return sum of x and y»»»
return x + y
assert add_numbers(4, 5) == 9
assert add_numbers(4) == ‘Not enough arguments’
assert add_numbers() == ‘Not enough arguments’
assert add_numbers(‘hello’) == ‘Not enough arguments’
assert add_numbers(3, 5, 6) == ‘Too many arguments’
assert add_numbers(‘a’, ‘b’, ‘c’) == ‘Too many arguments’
assert add_numbers(4.5, 5.1) == ‘Wrong types’
assert add_numbers(‘hello’, 4) == ‘Wrong types’
assert add_numbers(9, ‘hello’) == ‘Wrong types’
assert add_numbers([1, 3], {}) == ‘Wrong types’
assert add_numbers.__name__ == ‘add_numbers’
assert add_numbers.__doc__.strip() == ‘Return sum of x and y’
print(‘Good’)
# Напишите определение декоратора add_args
from functools import wraps
def add_args(func):
@wraps(func)
def inner(*args):
return func(‘begin’, *args, ‘end’)
return inner
# Код ниже не удаляйте, он нужен для проверки
@add_args
def concatenate(*args):
«»»
Возвращает конкатенацию переданных строк
«»»
return ‘, ‘.join(args)
@add_args
def find_max_word(*args):
«»»
Возвращает слово максимальной длины
«»»
return max(args, key=len)
print(concatenate(‘hello’, ‘world’, ‘my’, ‘name is’, ‘Artem’))
assert concatenate(‘hello’, ‘world’, ‘my’, ‘name is’, ‘Artem’) == ‘begin, hello, world, my, name is, Artem, end’
assert concatenate(‘my’, ‘name is’, ‘Artem’) == ‘begin, my, name is, Artem, end’
assert concatenate.__name__ == ‘concatenate’
assert concatenate.__doc__.strip() == «»»Возвращает конкатенацию переданных строк»»»
assert find_max_word(‘my’) == ‘begin’
assert find_max_word(‘my’, ‘how’) == ‘begin’
assert find_max_word(‘my’, ‘how’, ‘maximum’) == ‘maximum’
assert find_max_word.__name__ == ‘find_max_word’
assert find_max_word.__doc__.strip() == «»»Возвращает слово максимальной длины»»»
Напишите декоратор
validate_args
, который валидирует (проверяет на корректность) переданные аргументы. Аргументы нужно проверить на следующее:Not enough arguments
Too many arguments
Wrong types
from functools import wraps
def validate_args (func):
@wraps(func)
def inner(*args):
if len (args) < 2:
s=’Not enough arguments’
elif len (args) > 2:
s=’Too many arguments’
elif type(args[0]) != int or type(args[1]) != int:
s=’Wrong types’
else:
s=func(*args)
return s
return inner
на новый задачам когда решите пжл