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

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

  • Задание 1 — инверсия словаря.
  • Задание 2 — замена чисел на слова.
  • Задание 3 — факториал с проверкой.
  • Задание 4 — бинарный поиск.
  • Задание 5 — сумма цифр числа.
  • Задание 6 — сумма чисел во вложенных списках.
  • Задание 7 — собственный deepcopy.
  • Задание 8 — функция объединения данных в строку с type hints.

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

Выполните задания в отдельных файлах. Для каждой функции добавьте docstring и аннотации типов.

Цель: закрепить работу с docstrings, type hints, словарями, рекурсией и глубоким копированием.

Задание 1. Инверсия словаря

Условие: создайте новый словарь, где значения исходного словаря становятся ключами, а ключи — значениями.

Данные: original_dict = {"a": 1, "b": 2, "c": 3}

Ожидаемый результат: {1: 'a', 2: 'b', 3: 'c'}

Задание 2. Из чисел в слова

Условие: замените числовые значения в словаре на их строковое представление по словарю сопоставлений.

Данные:

number_to_word = {1: "один", 2: "два", 3: "три"}
data = {"x": 1, "y": 2, "z": 3}

Ожидаемый результат: {'x': 'один', 'y': 'два', 'z': 'три'}

Задание 3. Факториал с проверкой

Условие: реализуйте factorial(n) с guard clause для отрицательных чисел и корректным базовым случаем.

Ожидаемый результат: factorial(5) == 120, factorial(0) == 1, factorial(-1) вызывает ValueError.

Задание 4. Бинарный поиск

Условие: напишите рекурсивную функцию binary_search(arr, target, left, right), которая возвращает индекс target или None.

Данные: array = [1, 3, 5, 7, 9, 11, 13]

Ожидаемый результат: поиск 52, 136, 8None.

Задание 5. Сумма цифр числа

Условие: напишите рекурсивную функцию sum_digits(n), которая возвращает сумму всех цифр числа.

Данные: num = 43197

Ожидаемый результат: 24

Задание 6. Сумма вложенных чисел

Условие: напишите рекурсивную функцию sum_nested(numbers), которая суммирует все числа во вложенных списках.

Данные: nested_numbers = [1, [2, 3], [4, [5, 6]], 7]

Ожидаемый результат: 28

Задание 7. Собственный аналог deepcopy

Условие: реализуйте функцию deep_copy(data), которая рекурсивно копирует списки, кортежи, множества и словари. Проверьте, что изменение копии не затрагивает оригинал.

Данные:

original_data = [
    [1, 2, 3],
    (4, [5, 6], {7, 8}),
    {"a": 9, "b": [10, 11]},
    "Hello",
    [12, (13, 14)],
    15.5,
    5
]

Проверка: после original_data[1][1][0] = 0 вложенный элемент в копии должен остаться неизменным.

Задание 8. Объединение данных в строку (★ дополнительно)

Условие: напишите функцию join_data(data), которая принимает список любых данных и возвращает их строковое представление, объединённое через " | ". Добавьте docstring и аннотации типов.

Данные: data = [42, "hello", [1, 2, 3], {"a": 1, "b": 2}]

Ожидаемый результат: 42 | hello | [1, 2, 3] | {'a': 1, 'b': 2}

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

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

Вопрос 1

Как лучше использовать summary-урок?

Вопрос 2

Что показывает хороший результат после повторения блока?

Вопрос 3

Какой вопрос стоит задать себе после каждого ответа?

Вопрос 4

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

Вопрос 5

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

Вопрос 6

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

Вопрос 7

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

Вопрос 8

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