📝 Практические задания

⚡ Задания в двух словах

  1. Создать фабрику расчёта НДС.
  2. Создать калькулятор скидок по категориям.
  3. Создать настраиваемую функцию вывода.
  4. Создать декоратор для подсчёта вызовов.

Задание 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.

Проверка понимания

Выберите один вариант ответа. После клика правильный ответ подсветится зелёным.

Вопрос 1

Что такое декоратор?

Вопрос 2

Что делает yield?

Вопрос 3

Какой стиль имён переменных обычно рекомендует PEP 8?

Вопрос 4

Зачем использовать f-strings в современном Python?

Вопрос 5

Когда полезен ранний возврат из функции?

Вопрос 6

Что делает аннотация типа в Python?

Вопрос 7

Как лучше обрабатывать ожидаемую ошибку преобразования?