Задание 1. Фабрика функций расчёта НДС
Условие: создайте функцию vat_calculator(rate), которая принимает ставку НДС и возвращает другую функцию. Полученная функция должна принимать сумму и возвращать цену с учётом НДС по переданной ставке.
Пример вызова:
vat_20 = vat_calculator(0.2)
vat_10 = vat_calculator(0.1)
print(vat_20(100))
print(vat_10(200))
Ожидаемый вывод:
120.0
220.0
Подсказка: используйте замыкание, чтобы сохранить rate во внешней функции.
Задание 2. Калькулятор скидок по категориям
Условие: создайте функцию, которая возвращает другую функцию для расчёта скидки. Внешняя функция принимает словарь скидок, например {"food": 0.1} — 10% на еду. Если категория не найдена, цена не меняется.
Данные:
discounts = {"food": 0.1, "clothes": 0.2}
Пример вызова:
friday_discount = discount_maker(discounts)
print(friday_discount("food", 100))
print(friday_discount("clothes", 250))
print(friday_discount("electronics", 500))
Ожидаемый вывод:
90.0
200.0
500
Задание 3. Настроенная функция вывода
Условие: создайте функцию custom_printer(sep, end), которая возвращает новую функцию печати, использующую указанные значения sep и end по умолчанию.
Пример вызова:
printer = custom_printer(sep=' | ', end=' -->\n')
printer('Hello', 'World')
printer('Python', 'Java', 'C++')
Ожидаемый вывод:
Hello | World -->
Python | Java | C++ -->
Подсказка: используйте *args внутри вложенной функции, чтобы принимать любое количество аргументов.
Задание 4. Нумерация вызовов функции
Условие: создайте декоратор call_counter, который выводит имя и номер вызова функции каждый раз, когда она вызывается. Номер должен увеличиваться при каждом вызове.
Пример декорируемой функции:
@call_counter
def greet():
print("Привет!")
greet()
greet()
greet()
Ожидаемый вывод:
Вызов функции 'greet' №1:
Привет!
Вызов функции 'greet' №2:
Привет!
Вызов функции 'greet' №3:
Привет!
Подсказка: для хранения счётчика используйте замыкание с nonlocal.