Решение модуля 7.14 Инди-курс программирования на Python

Модуль 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                         # возвращаем итоговый результат

Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы

Понравилась статья? Поделиться с друзьями:
Подписаться
Уведомить о
guest

7 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Линнар
Линнар
1 год назад

Декоратор-запоминаторДавайте вспомним рекурсивную функцию Фибоначчи

def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

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

print(fibonacci(10))

то она быстро завершит работу и вернет результат. Но попробуйте дождаться завершения если вызовете от сорока

print(fibonacci(40))

Дождаться пока функция найдет сотое число Фибоначчи будет нереально. Но мы можем придумать декоратор, который будет запоминать в себе аргументы функции и возвращаемые значения. Для этого нужно воспользоваться мемоизацией

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

В этом задании вам нужно определить декоратор memoize, который принимает функцию в качестве аргумента и возвращает функцию-оболочку. Функция-оболочка проверяет, были ли входные данные для функции просмотрены ранее и сохранены ли они в кеше. Если это так, функция просто возвращает кэшированный результат. Если нет, она вызывает исходную функцию и сохраняет результат в кеше для использования в будущем. Кеш представляет собой хранилище ранее вычиленных значений, в нашем случае можно использовать словарь
Затем мы применяем этот декоратор к рекурсивной функции fibonacci. Когда функция fibonacci вызывается с определенным входным значением, логика мемоизации проверяет, был ли результат уже рассчитан и сохранен в кеше. Если был, кэшированный результат возвращается немедленно. Если нет, то будет вызвана функция fibonacci для вычисления результата, и результат будет сохранен в кеше для использования в будущем.
Ваша задача реализовать декоратор memoize, который помимо выше описанного еще и должен сохранить первоначальное имя декорируемой функцию и ее строку документации
Sample Input:
Sample Output:

Good
Johny
Johny
Ответить на  Линнар
1 год назад

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

Кирилл
Кирилл
1 год назад

# Напишите определение декоратора 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’)

Кирилл
Кирилл
1 год назад

# Напишите определение декоратора 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() == «»»Возвращает слово максимальной длины»»»

Akbarali
Akbarali
1 год назад

Напишите декоратор validate_args, который валидирует (проверяет на корректность) переданные аргументы. Аргументы нужно проверить на следующее:

  1. Должно быть передано именно два аргумента. Если передано меньшее количество, декоратор должен вернуть строку
  2. Not enough arguments
  3. Если передано более двух аргументов, то возвращаем строку
  4. Too many arguments
  5.  
  6. Оба аргумента должны быть целыми числами. Если хотя бы одно из них не целое число, возвращаем строку
  7. Wrong types
 
Alex
Alex
Ответить на  Akbarali
1 год назад

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

Akbarali
Akbarali
1 год назад

на новый задачам когда решите пжл

7
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x