Перейти к содержимому
Поиск
Разработка

Python: полный мануал с примерами и справочником функций

Полный практический мануал Python: от установки и синтаксиса до файлов, сети, тестов и проектов. 25 глав, справочник функций и методов, упражнения с решениями и 195 проверенных примеров.

Александр Некрасов
Python: практический мануал с кодом, папкой и схемой работы

Python удобно изучать на задачах: посчитать расходы, разобрать текст, прочитать файл, собрать отчёт. В этом руководстве пройдём путь от установки и первых выражений до функций, классов, сети, тестов и самостоятельных проектов.

Выберите одну из 25 глав или найдите нужную функцию через поиск. В справочнике собраны все 73 позиции официальной таблицы встроенных функций и типов Python 3.15, а также 161 метод и 12 свойств строк, коллекций и путей. Для каждой позиции есть назначение, важный нюанс и ссылка на первичную документацию.

Код можно копировать и скачивать. 195 самостоятельных примеров проверены запуском на Python 3.15.0; у упражнений есть решения и ожидаемый результат. Новые возможности языка отмечены в тексте, а интерактивные фрагменты и команды установки объяснены отдельно.

Если начинаете с нуля, открывайте главы по порядку. Если решаете конкретную задачу, ищите по-русски или по имени Python: open, str.split, Path.read_text.

Python 3.15.025 главПримеры проверены запуском
Все главы руководства 25

Глава 11 · средний

Исключения и ресурсы: понятная ошибка вместо скрытого сбоя

Читайте traceback, обрабатывайте ожидаемые ошибки и гарантируйте завершение работы с ресурсами.

Начните с места и причины ошибки

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

Traceback показывает путь к месту сбоя. Последняя строка содержит тип исключения и сообщение; предшествующие строки помогают найти операцию вашего кода. Начинайте с ближайшей относящейся к вашей программе строки. Название исключения указывает класс проблемы, но точная причина зависит от данных и контекста.

Для int неправильный текст приводит к ValueError. Попытка обратиться к отсутствующему ключу вызывает KeyError, несовместимые аргументы — TypeError. Не заменяйте все эти ситуации одной надписью «Ошибка». Посетителю нужна возможность исправить ввод, а разработчику — достаточная информация, чтобы повторить сбой.

values = ["12", "ошибка", ""]
for text in values:
    try:
        number = int(text)
    except ValueError:
        print("Введите целое число")
    else:
        print(number * 2)
24
Введите целое число
Введите целое число

Обрабатывайте ожидаемую операцию

Try обозначает участок, где может возникнуть ожидаемая неудача. Except перехватывает подходящий тип; else выполняется, если этот участок завершился успешно. Перенос дальнейшей обработки в else помогает не принять её собственную ошибку за сбой исходного преобразования.

Используйте узкий обработчик вокруг понятного действия. Если проверяете текстовое число, перехватывайте ValueError. Исключение AttributeError в расчёте может указывать на ошибку программы, которую нельзя исправить предложением ввести число заново. Широкий except без осмысленного результата превращает полезную диагностику в неожиданное поведение.

Иногда удобно сначала проверить условие: например, недопустимое отрицательное количество. Иногда надёжнее выполнить действие и обработать неудачу. Проверка exists перед open не гарантирует, что файл останется доступен к моменту открытия. Такой выбор между предварительной проверкой и обработкой результата определяется свойствами операции, а не одним универсальным стилем.

Добавьте смысл на границе своего модуля

Собственное исключение позволяет описать проблему языком задачи. Например, модуль чтения заказа может сообщать InvalidRecord вместо внутреннего ValueError. Наследуйте прикладное исключение от Exception или подходящего обычного подкласса. BaseException включает также прерывание пользователем и другие события, которые обычно должны продолжать своё завершение.

Raise без нового объекта повторно передаёт текущее исключение. Запись raise NewError(...) from error сохраняет явную связь причин. Получатель видит понятный тип прикладной проблемы, а traceback позволяет найти исходную неудачу. В сообщении добавляйте идентификатор записи или название поля, но не подменяйте им всю причину.

Текст ошибки сам по себе не является стабильным API для управления ветвлением. Проверяйте тип и предусмотренные атрибуты исключения. Если нужно дополнить диагностическую информацию, с Python 3.11 доступен add_note. Не разбирайте чужую англоязычную строку по словам, когда есть явный тип FileNotFoundError или HTTP-статус.

class InvalidRecord(ValueError):
    pass

def read_quantity(text):
    try:
        value = int(text)
    except ValueError as error:
        raise InvalidRecord("Поле quantity не является целым числом") from error
    if value < 0:
        raise InvalidRecord("Количество не может быть отрицательным")
    return value

try:
    read_quantity("не число")
except InvalidRecord as error:
    print(type(error).__name__)
    print(type(error.__cause__).__name__)
print(read_quantity("0"))
InvalidRecord
ValueError
0

Finally и with завершают начатую работу

Finally выполняется при выходе из try независимо от обычного результата или исключения. В нём уместно освобождение принадлежащего вам ресурса. Но возвращать значение из finally опасно: это может заменить предыдущий return или скрыть исключение. Python 3.14 добавил предупреждения для некоторых таких выходов; понятнее держать итоговый return отдельно.

Контекстный менеджер объединяет вход в работу и выход из неё. В конструкции with объект получает возможность подготовить ресурс и завершить его использование. Для файла это обычно закрытие, для блокировки — освобождение. Ошибка внутри with не исчезает автоматически: менеджер должен явно решить, подавляет ли он её.

Для собственного контекста удобен contextlib.contextmanager. Код до yield готовит ресурс, значение yield передаётся в as, а очистка в finally выполняется после блока. Внутри такой генератор должен выдать одно значение. Если набор ресурсов определяется в ходе работы, ExitStack собирает контексты и закрывает их в обратном порядке.

from contextlib import contextmanager, ExitStack

@contextmanager
def resource(name):
    print("Открыт", name)
    try:
        yield name
    finally:
        print("Закрыт", name)

try:
    with ExitStack() as stack:
        stack.enter_context(resource("А"))
        stack.enter_context(resource("Б"))
        raise ValueError("Учебная ошибка")
except ValueError:
    print("Ошибка обработана")
Открыт А
Открыт Б
Закрыт Б
Закрыт А
Ошибка обработана

Несколько ошибок и отмена задачи

ExceptionGroup, доступная с Python 3.11, объединяет независимые исключения. Конструкция except* выбирает подходящие части группы. Она нужна, например, когда несколько конкурентных задач могут завершиться неудачей. Это отличается от обычного except, который рассматривает группу как один объект.

Необработанные части продолжают передаваться дальше. Поэтому заранее определите, какие ошибки можно исправить локально, а какие должны завершить всю операцию. В следующем примере обе категории обработаны, и программа успешно заканчивается. Число элементов проверяемо; оно не зависит от полного текста traceback.

Для асинхронной отмены нужен отдельный смысл. CancelledError связан с прекращением задачи; cleanup обычно должен выполниться, после чего отмена передаётся дальше. Если её незаметно подавить, TaskGroup или таймаут могут работать неожиданно. Подробный маршрут остановки разобран в главе о конкуренции.

try:
    raise ExceptionGroup("Проверка записей", [
        ValueError("Первое число"),
        TypeError("Неподходящий объект"),
        ValueError("Второе число"),
    ])
except* ValueError as errors:
    print("Ошибок значения:", len(errors.exceptions))
except* TypeError as errors:
    print("Ошибок типа:", len(errors.exceptions))
Ошибок значения: 2
Ошибок типа: 1

Как закончить обработку понятно

На границе интерфейса переведите техническую неудачу в следующий шаг: исправить поле, выбрать файл, повторить чтение. Внутри расчёта сохраняйте точную причину. Не выводите пользователю полный traceback вместо понятного сообщения, если он не может использовать его для исправления действия.

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

Проверьте обычный ввод, неправильное значение и ошибку после открытия ресурса. Убедитесь, что программа не продолжает расчёт с выдуманным нулём, если ноль означает настоящий результат. Для внешнего ввода используйте явную проверку и raise: assert может отключаться с оптимизацией и предназначен для другого рода предположений.

Попробуйте самостоятельно. Функция должна читать quantity, отвергать отрицательные числа и сохранять причину ошибки преобразования. Где поставить try?

Посмотреть решение

Охватите int(text) отдельным try/except ValueError и передайте прикладное исключение через raise ... from error. Проверку отрицательного значения выполните после успешного преобразования. Этот маршрут уже реализован в read_quantity; добавьте самостоятельный вызов с "-1" и обработайте InvalidRecord.

Примеры и материалы с собой

Архив содержит наши самостоятельные примеры, тестовые данные, ожидаемый результат и README. Указанные команды установки и фрагменты REPL отделены от скриптов, которые проверены запуском.

Сверено с официальной документацией 2026-10-12. Стандартная библиотека и сторонние пакеты различаются; ссылки на источники есть в каждой главе.