🏠 Домашнее задание

⚡ Суть задания

Напишите две функции с docstring и аннотациями типов: одна объединяет произвольные данные в строку через " | ", другая считает сумму вложенных чисел в списке словарей.

Результат: два запускаемых файла с корректным выводом в терминале.

📋 Формулировка задания

Исходное задание из LMS:

  1. Объединение данных в строку. Напишите функцию, которая принимает список любых данных (строки, числа, списки, словари) и возвращает их строковое представление, объединённое через " | ". Добавьте документацию и аннотации типов для всех параметров и возвращаемого значения.
    data = [42, "hello", [1, 2, 3], {"a": 1, "b": 2}]
    # Пример вывода:
    # 42 | hello | [1, 2, 3] | {'a': 1, 'b': 2}
  2. Сумма вложенных чисел. Напишите функцию, которая принимает список словарей, где каждый словарь содержит имя пользователя и список баллов. Функция должна вернуть сумму всех чисел. Добавьте документацию и аннотации типов для всех параметров и возвращаемого значения.
    data = [
        {"name": "Alice", "scores": [10, 20, 30]},
        {"name": "Bob", "scores": [5, 15, 25]},
        {"name": "Charlie", "scores": [7, 17, 27]}
    ]
    # Пример вывода:
    # Итоговый балл: 156

🔧 Шаг 0. Подготовка окружения

Перед началом работы настройте рабочее окружение. Эти шаги одинаковы для большинства уроков курса.

1

Создайте рабочую папку

В VS Code нажмите Ctrl+K Ctrl+O → выберите или создайте папку для практических работ, например python-fundamentals-practice.

# Или в терминале VS Code (Ctrl + `):
mkdir python-fundamentals-practice
cd python-fundamentals-practice
2

Создайте папку для урока 44

mkdir lesson-44
cd lesson-44
3

Создайте виртуальное окружение (venv)

# Windows (PowerShell / CMD)
python -m venv venv
venv\Scripts\activate

# Mac / Linux
python3 -m venv venv
source venv/bin/activate

После активации в начале строки терминала появится (venv).

🛠️ Шаги выполнения задания

1

Задание 1. Объединение данных в строку

Создайте файл task1_join_data.py и реализуйте функцию join_data:

# task1_join_data.py
from typing import Any, List


def join_data(data: List[Any]) -> str:
    """
    Объединяет элементы списка в строку через разделитель " | ".

    :param data: Список элементов любых типов.
    :return: Строковое представление элементов, объединённых через " | ".
    """
    return " | ".join(str(item) for item in data)


if __name__ == "__main__":
    data = [42, "hello", [1, 2, 3], {"a": 1, "b": 2}]
    print(join_data(data))

Проверка в VS Code:

  1. Убедитесь, что venv активирован.
  2. Запустите: python task1_join_data.py
  3. Ожидаемый вывод: 42 | hello | [1, 2, 3] | {'a': 1, 'b': 2}
2

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

Создайте файл task2_sum_scores.py и реализуйте функцию sum_nested_scores:

# task2_sum_scores.py
from typing import List


def sum_nested_scores(data: List[dict[str, object]]) -> int:
    """
    Считает сумму всех чисел из списка словарей с баллами.

    :param data: Список словарей, где каждый словарь содержит
                 ключ "name" со строкой и ключ "scores" со списком чисел.
    :return: Сумма всех чисел.
    """
    total = 0
    for record in data:
        for score in record["scores"]:
            total += score
    return total


if __name__ == "__main__":
    data = [
        {"name": "Alice", "scores": [10, 20, 30]},
        {"name": "Bob", "scores": [5, 15, 25]},
        {"name": "Charlie", "scores": [7, 17, 27]}
    ]
    print(f"Итоговый балл: {sum_nested_scores(data)}")

Проверка в VS Code:

  1. Убедитесь, что venv активирован.
  2. Запустите: python task2_sum_scores.py
  3. Ожидаемый вывод: Итоговый балл: 156

✅ Полное решение

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

# homework_44.py
from typing import Any, List


def join_data(data: List[Any]) -> str:
    """
    Объединяет элементы списка в строку через разделитель " | ".

    :param data: Список элементов любых типов.
    :return: Строковое представление элементов, объединённых через " | ".
    """
    return " | ".join(str(item) for item in data)


def sum_nested_scores(data: List[dict[str, object]]) -> int:
    """
    Считает сумму всех чисел из списка словарей с баллами.

    :param data: Список словарей с ключами "name" и "scores".
    :return: Сумма всех чисел.
    """
    total = 0
    for record in data:
        for score in record["scores"]:
            total += score
    return total


if __name__ == "__main__":
    data1 = [42, "hello", [1, 2, 3], {"a": 1, "b": 2}]
    print(join_data(data1))

    data2 = [
        {"name": "Alice", "scores": [10, 20, 30]},
        {"name": "Bob", "scores": [5, 15, 25]},
        {"name": "Charlie", "scores": [7, 17, 27]}
    ]
    print(f"Итоговый балл: {sum_nested_scores(data2)}")

🧪 Как проверить решение

  1. Активируйте venv: venv\Scripts\activate (Windows) или source venv/bin/activate (Mac/Linux).
  2. Запустите файл: python task1_join_data.py и python task2_sum_scores.py.
  3. Проверьте, что вывод совпадает с примером из задания.
  4. Убедитесь, что в коде нет синтаксических ошибок: python -m py_compile task1_join_data.py task2_sum_scores.py.

🐛 Отладка в VS Code

Если что-то не работает:

  1. Поставьте точку останова (breakpoint) кликом слева от номера строки.
  2. Нажмите F5 или выберите «Run → Start Debugging».
  3. Используйте панель Debug для просмотра переменных и стека вызовов.
  4. Проверьте Terminal на наличие traceback — Python укажет строку с ошибкой.

💾 Сохранение работы

# Добавьте файлы урока в Git
git add lesson-44/
git commit -m "lesson-44: домашнее задание по документации и аннотациям типов"
git push

💡 Советы и типичные ошибки

  • Для списка любых типов используйте List[Any] или list[Any].
  • Не забывайте писать return, если функция аннотирована как возвращающая значение.
  • Аннотации не проверяются во время выполнения — передавайте аргументы правильных типов.
  • Для суммирования вложенных списков удобны вложенные циклы или функция sum() с генератором.