Урок 49. Практикум 12

⚡ Кратко: суть урока

Практикум 12 объединяет рекурсию и валидацию данных через исключения. Пять задач: сумма чисел списка, реверс строки, глубина вложенности списка, сумма продаж по дереву отделов и «плоский» формат вложенного словаря.

В каждой задаче функция сначала проверяет тип аргумента с помощью isinstance, а при ошибке возбуждает исключение. Внешний вызов оборачивается в try/except, чтобы программа не падала.

Ключевые конструкции: isinstance, guard clauses, рекурсия, raise TypeError, try/except, f-strings.

Минимальный рабочий пример:

def recursive_sum(numbers: list) -> float:
    """Return the sum of all numbers in a list recursively."""
    if not isinstance(numbers, list):
        raise TypeError("Argument must be a list")
    if not numbers:
        return 0

    head = numbers[0]
    if not isinstance(head, (int, float)):
        raise TypeError(f"All elements must be numbers, got {type(head).__name__}")
    return head + recursive_sum(numbers[1:])


numbers = [1, 2, 3, 4, 5]
try:
    print(recursive_sum(numbers))
except (TypeError, ValueError) as e:
    print(f"Ошибка: {e}")

Топ-3 ошибки: забыть базовый случай рекурсии; ловить всё подряд через «голый» except:; проверять тип через type(x) == list вместо isinstance.

📁 Блок: Python Fundamentals / Практикум ⏱️ Время изучения: ~90 мин 🎯 Сложность: Средняя
#isinstance #if #not #return #raise #except #try #as #get #type #print #def #in #else #len #max #for #and #is #items #update #with #from #mkdir #add #case #or #sum #pass

📖 О чём этот урок

Это практический урок, в котором нужно написать пять рекурсивных функций. Каждая функция не только решает задачу, но и защищается от некорректных входных данных: неверного типа аргумента, нечисловых элементов или неверной структуры вложенных коллекций.

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

🎯 Цели

  • Закрепить навык написания рекурсивных функций с чётким базовым случаем.
  • Применять isinstance для проверки типов аргументов и элементов коллекций.
  • Возбуждать исключения через raise при нарушении условий задачи.
  • Оборачивать вызовы функций в try/except для корректной реакции на ошибки.
  • Использовать guard clauses и ранний возврат для читаемого кода.
  • Работать со вложенными списками и словарями рекурсивно.

📂 Структура урока

📚 Что повторить перед изучением

🎯 Что изучать дальше