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

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

  • Задание 1 — запросить у пользователя число и обработать ошибки ввода.
  • Задание 2 — проверить возраст через raise.
  • Задание 3 — безопасное деление двух чисел.
  • Задание 4 — пользовательское исключение для банковского счёта.
  • Задание 5 — логирование ошибок в файл.
  • Задание 6 — использовать assert для внутренней проверки (дополнительно).

🏋️ Раздел тренировки

Выполните задания в отдельных файлах. Используйте конкретные исключения, guard clauses и логирование там, где это уместно.

Цель: научиться перехватывать ожидаемые ошибки, возбуждать исключения, создавать собственные классы ошибок и логировать сбои.

Задание 1. Обработка ввода пользователя

Условие: напишите программу, которая запрашивает у пользователя число и обрабатывает возможные ошибки ввода, пока не получит корректное число.

Пример вывода:

Введите число: qwe
Ошибка: Введите корректное число.
Введите число: 12.5
Вы ввели число: 12.5

Подсказка: используйте float() и бесконечный цикл с try/except ValueError.

Задание 2. Проверка возраста

Условие: напишите функцию check_age(age: int), которая проверяет, что возраст не меньше 18 лет. Если возраст меньше — возбудите ValueError с понятным сообщением.

Пример вывода:

Введите возраст: 17
Ошибка: Возраст должен быть 18 лет и старше.

Подсказка: используйте raise и обработайте исключение в основной программе.

Задание 3. Безопасное деление

Условие: напишите функцию safe_divide(dividend: str, divisor: str), которая выполняет деление двух чисел, введённых пользователем, и обрабатывает возможные ошибки.

Пример вывода:

Введите делимое: 345
Введите делитель: 5a
Ошибка: Введено некорректное число.

Ожидаемое поведение: обработать ValueError (некорректное число) и ZeroDivisionError (деление на ноль).

Задание 4. Пользовательское исключение для счёта

Условие: создайте класс исключения InsufficientFundsError и функцию withdraw(balance: float, amount: float) -> float. Если amount > balance, возбудите исключение. Иначе верните новый баланс.

Пример вывода:

Баланс: 100, снятие: 150
Ошибка: Недостаточно средств: баланс 100, требуется 150
⚠️ Проверить по документации: пользовательские исключения не разбираются в исходной лекции, но являются стандартным инструментом Python.

Задание 5. Логирование ошибок

Условие: измените функцию из задания 3 так, чтобы при ошибках сообщения записывались в файл errors.log с форматом:

2025-02-23 22:38:53,686 - ERROR - module.py - 16 - Ошибка: Введено некорректное число.

Подсказка: используйте logging.basicConfig с параметрами filename, format и level.

Задание 6. Использование assert (★ дополнительно)

Условие: напишите функцию apply_discount(price: float, discount: float) -> float. Используйте assert, чтобы убедиться, что цена и скидка неотрицательны, а скидка не больше 1.

Пример: apply_discount(100.0, 0.2)80.0; apply_discount(100.0, 1.5)AssertionError.

⚠️ Проверить по документации: assert не входит в исходную лекцию, но используется для внутренних инвариантов.

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

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

Вопрос 1

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

Вопрос 2

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

Вопрос 3

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

Вопрос 4

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

Вопрос 5

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

Вопрос 6

Чем отличается = от ==?

Вопрос 7

Что делает print()?