Базовые знания по языку программирования Python

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

1. Введение в Python и настройка окружения

Введение в Python и настройка окружения

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

Что такое Python

Python — это интерпретируемый язык. Это значит, что ваш код выполняется программой-интерпретатором python, которая читает текст программы и запускает инструкции.

Важно различать:

  • Python (язык) — правила написания кода.
  • Интерпретатор Python — программа, которая выполняет ваш код.
  • Среда разработки (IDE/редактор) — приложение, где вы пишете код (например, Visual Studio Code).
  • Какие версии Python использовать

    Для обучения и большинства задач выбирайте Python 3 (Python 2 устарел).

    Рекомендации:

  • Ставьте актуальную стабильную версию Python 3 с официального сайта.
  • Если в инструкции где-то встречается просто python, а в системе это Python 2 или команда не находится — мы разберём, как проверить и исправить.
  • Официальные источники:

  • Python Downloads
  • Документация Python
  • Установка Python

    Windows

  • Скачайте установщик с Python Downloads.
  • Запустите установку.
  • На первом экране установщика обязательно отметьте Add python.exe to PATH.
  • Нажмите Install Now.
  • Пояснение про PATH:

  • PATH — это настройка системы, которая позволяет запускать команды (например, python) из терминала из любой папки.
  • macOS

  • Перейдите на Python Downloads и скачайте установщик для macOS.
  • Установите Python.
  • Откройте Терминал и проверьте команду python3.
  • Примечание:

  • На macOS часто уже есть системный Python, но для разработки лучше использовать установленный отдельно Python 3 и запускать его как python3.
  • Linux

    На многих дистрибутивах Python 3 уже установлен. Проверка:

    Если не установлен, используйте пакетный менеджер вашего дистрибутива (пример для Ubuntu/Debian):

    Проверка установки

    Откройте терминал (на Windows это может быть PowerShell или Командная строка) и выполните:

    Если команда не находится, попробуйте:

    Что должно получиться:

  • Вы увидите версию вида Python 3.x.y.
  • Первый запуск Python: интерактивный режим и скрипт

    Интерактивный режим (REPL)

    REPL — это режим, где вы вводите команды по одной строке и сразу видите результат.

    Запуск:

    Или на некоторых системах:

    Пример:

    Выход:

  • Windows: Ctrl+Z, затем Enter
  • macOS/Linux: Ctrl+D
  • Запуск файла (скрипта)

    Обычно программы пишут в файлах с расширением .py.

  • Создайте файл hello.py со следующим содержимым:
  • Запустите в терминале из папки с файлом:
  • Если у вас используется python3:

    Пакеты и pip

    В Python часто используют пакеты — готовые библиотеки, которые добавляют новые возможности (например, работа с HTTP, таблицами, графиками).

    Для установки пакетов обычно используют pip.

    Проверка:

    Или:

    Пример установки пакета:

    Официальная справка по pip:

  • pip documentation
  • Виртуальные окружения: зачем они нужны

    Виртуальное окружение — это отдельная папка с собственной копией зависимостей (пакетов). Оно помогает:

  • не смешивать пакеты разных проектов;
  • избегать конфликтов версий;
  • воспроизводить окружение проекта.
  • Создание и активация venv

    Перейдите в папку проекта и выполните:

    Активация:

  • Windows (PowerShell):
  • Windows (cmd):
  • macOS/Linux:
  • После активации команды python и pip будут относиться к этому окружению.

    Выход из окружения:

    Выбор редактора или IDE

    Для обучения подойдут разные варианты:

  • Visual Studio Code — лёгкий редактор с расширениями.
  • PyCharm Community Edition — полноценная IDE для Python.
  • Ссылки:

  • Visual Studio Code
  • Python extension for Visual Studio Code
  • PyCharm
  • Рекомендация для начала:

  • Установите VS Code и расширение Python.
  • Настройте проект так, чтобы VS Code использовал интерпретатор из .venv.
  • !Схема, показывающая как связаны редактор, терминал, venv и запуск скрипта

    Типичные проблемы и быстрые решения

    Команда python не найдена

    Возможные причины:

  • Python не установлен.
  • Python установлен, но не добавлен в PATH.
  • На системе используется команда python3 вместо python.
  • Что сделать:

  • Попробуйте python3 --version.
  • Переустановите Python и отметьте добавление в PATH (особенно на Windows).
  • pip ставит пакеты “не туда”

    Частая причина — вы забыли активировать виртуальное окружение.

    Проверка:

  • Активируйте .venv.
  • Убедитесь, что python и pip относятся к окружению:
  • Путь должен указывать на .venv.

    Итоги

    Теперь у вас есть базовое окружение для обучения:

  • установлен Python 3;
  • вы умеете запускать Python в интерактивном режиме и через файл .py;
  • знаете, что такое pip и виртуальное окружение venv;
  • выбрали редактор/IDE и понимаете общий рабочий процесс.
  • В следующей статье мы перейдём к основам синтаксиса: переменным, типам данных и простым операциям.

    2. Синтаксис, переменные и базовые типы данных

    Синтаксис, переменные и базовые типы данных

    В прошлой статье вы установили Python, научились запускать код в интерактивном режиме (REPL) и через файл .py, а также настроили виртуальное окружение. Теперь перейдём к основам языка: как выглядит код на Python, что такое переменные и какие типы данных встречаются чаще всего.

    Как «читается» программа на Python

    Программа — это последовательность инструкций, которые интерпретатор выполняет сверху вниз.

    Пример файла main.py:

    Если запустить файл, строки выполнятся по порядку.

    Отступы и блоки кода

    В Python блоки кода (например, внутри условия или цикла) выделяются отступами, а не фигурными скобками.

    Пример:

    Важно:

  • Обычно используют 4 пробела на один уровень отступа.
  • Нельзя «перемешивать» отступы как попало: все строки одного блока должны иметь одинаковый отступ.
  • Комментарии

    Комментарий — это текст для человека, который Python не выполняет.

    Чувствительность к регистру

    Python различает заглавные и строчные буквы:

    Переменные

    Переменная — это имя, которое ссылается на значение в памяти.

    Пример:

    Как присваивать значения

    Обычное присваивание:

    Множественное присваивание:

    Обмен значениями без «третьей переменной»:

    !Переменная — это имя, которое указывает на значение

    Правила именования

    Хорошие имена помогают читать код.

  • Имя может содержать буквы, цифры и символ _, но не может начинаться с цифры.
  • Пробелы запрещены.
  • Желательно использовать стиль snake_case.
  • Примеры:

    Зарезервированные слова

    Некоторые слова — часть синтаксиса Python, их нельзя использовать как имена переменных.

    Например: if, else, for, while, def, class, True, False, None.

    Полный список зависит от версии Python и приведён в документации:

  • Python keywords
  • Базовые типы данных

    Тип данных определяет:

  • какие значения возможны;
  • какие операции можно выполнять.
  • Проверить тип можно функцией type():

    Целые числа int

    int — целые числа без дробной части.

    Числа с плавающей точкой float

    float — числа с дробной частью.

    Особенность: float хранит число приближённо, поэтому иногда возможны «странные» результаты при вычислениях.

    Строки str

    str — текст. Строки берутся в кавычки: одинарные или двойные.

    Полезные операции:

    Метод — это функция, «принадлежащая» значению. Например, upper() — метод строки.

    #### f-строки (удобное форматирование)

    Логический тип bool

    bool имеет два значения: True и False. Обычно используется в условиях.

    Результаты сравнений — тоже bool:

    Специальное значение None

    None означает «нет значения» или «значение пока неизвестно».

    Это не строка и не число — это отдельный тип.

    Ввод и вывод

    Вывод: print()

    print() печатает значения в терминал.

    Ввод: input()

    input() читает строку из терминала.

    Важно: input() всегда возвращает str. Если нужно число, делайте преобразование.

    Преобразование типов

    Иногда нужно явно преобразовать одно значение в другой тип.

    Примеры:

    Если строка не похожа на число, int() и float() вызовут ошибку.

    Частые ошибки новичков

  • Забыли кавычки у строки
  • Перепутали = и ==
  • Неправильные отступы
  • Ожидали число из input()
  • Итоги

    В этой статье вы освоили основу чтения и написания кода на Python:

  • как работают отступы и комментарии;
  • что такое переменные и как их правильно именовать;
  • базовые типы данных: int, float, str, bool, None;
  • ввод и вывод, а также преобразование типов.
  • Дальше эти знания станут базой для условий и циклов: мы будем принимать решения в коде и повторять действия много раз.

    3. Условия, циклы и управление потоком выполнения

    Условия, циклы и управление потоком выполнения

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

    Управление потоком выполнения

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

  • выполнять код только если выполнено условие;
  • повторять действия много раз;
  • прерывать или пропускать часть выполнения.
  • !Блок-схема показывает, как программа выбирает ветку по условию и как цикл возвращает выполнение к проверке условия

    Условия

    Условие в Python записывается с помощью if, а альтернативные ветки — elif и else.

    Базовый if

    Важно:

  • после условия ставится двоеточие :;
  • тело условия оформляется отступом (обычно 4 пробела).
  • Документация: The if statement

    else и elif

    else выполняется, если условие if ложно.

    elif добавляет дополнительные проверки.

    Рекомендации:

  • располагайте проверки от более строгих к более общим;
  • используйте elif, если ветки взаимоисключающие.
  • Операторы сравнения

    Условия обычно строят на сравнениях:

    | Оператор | Значение | Пример | |---|---|---| | == | равно | x == 10 | | != | не равно | x != 10 | | > | больше | x > 0 | | < | меньше | x < 0 | | >= | больше или равно | x >= 18 | | <= | меньше или равно | x <= 100 |

    Сравнения возвращают bool: True или False.

    Логические операторы and, or, not

  • and требует, чтобы оба условия были истинны.
  • or требует, чтобы хотя бы одно было истинно.
  • not инвертирует значение.
  • Истинность значений: что считается True и False

    В if можно передавать не только bool. Python приведёт значение к логическому.

    Чаще всего False дают:

  • 0, 0.0
  • пустая строка ""
  • пустые коллекции (например, пустой список [])
  • None
  • Всё остальное обычно считается True.

    Пример с вводом (помните: input() возвращает строку):

    Документация: Truth Value Testing

    Вложенные условия

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

    Практический совет: если вложенность растёт, подумайте, можно ли объединить проверку через and.

    Циклы

    Циклы нужны, когда вы хотите повторять действие.

    В Python основные циклы:

  • while повторяет, пока условие истинно;
  • for перебирает элементы последовательности.
  • Документация: The while statement, The for statement

    Цикл while

    while проверяет условие перед каждой итерацией.

    Ключевой момент: внутри цикла обычно нужно изменять переменные, влияющие на условие. Иначе получится бесконечный цикл.

    Пример с вводом и проверкой:

    Цикл for

    for в Python перебирает элементы.

    Часто нужно повторить действие фиксированное число раз — тогда используют range().

    range()

    range(n) создаёт последовательность чисел от 0 до n - 1.

    Можно задавать начало и конец:

    И шаг:

    Документация: range

    break и continue

    break немедленно завершает цикл.

    continue пропускает текущую итерацию и переходит к следующей.

    else у циклов

    В Python у циклов есть ветка else. Она выполняется, если цикл завершился без break.

    Это удобно при поиске.

    pass

    pass — это команда-заглушка: она ничего не делает. Нужна, когда синтаксически блок должен быть, но логика пока не готова.

    Типичные ошибки и как их избегать

  • = вместо == в условии
  • Неправильные отступы в блоках if и циклах
  • Бесконечный while из-за того, что условие никогда не меняется
  • Ожидание числа из input() без преобразования
  • Пример с корректным преобразованием:

    Итоги

    Теперь вы умеете управлять логикой программы:

  • писать условия if, elif, else и составлять их через and, or, not;
  • понимать, какие значения считаются истинными и ложными;
  • использовать циклы while и for, а также range();
  • управлять циклом с помощью break, continue, else и pass.
  • Эти конструкции — основа почти любой программы: они позволяют принимать решения и повторять действия в зависимости от данных.

    4. Коллекции: строки, списки, кортежи, множества, словари

    Коллекции: строки, списки, кортежи, множества, словари

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

    Коллекции позволяют хранить несколько значений в одной переменной и удобно их обрабатывать: перебирать в for, проверять наличие через in, выбирать элементы по индексу, группировать данные по ключам.

    Что такое коллекция в Python

    Коллекция — это объект, который хранит набор элементов.

    Самые базовые коллекции в Python:

  • str — строка (последовательность символов)
  • list — список (изменяемая последовательность)
  • tuple — кортеж (неизменяемая последовательность)
  • set — множество (набор уникальных элементов без порядка)
  • dict — словарь (пары ключ → значение)
  • !Шпаргалка по отличиям основных коллекций Python

    Общие операции для коллекций

    Эти операции встречаются почти везде:

  • len(x) — количество элементов
  • x in collection — проверка наличия
  • for item in collection: — перебор
  • Пример:

    Важно: некоторые коллекции упорядоченные (например, str, list, tuple), а некоторые — нет (например, set). Это влияет на то, можно ли обращаться по индексу и гарантирован ли порядок.

    Строки str

    Строка — это последовательность символов. Строки в Python неизменяемы.

    Индексация и срезы

    Индексация начинается с 0.

    Срез берёт часть строки: text[start:stop:step].

    Полезные методы строк

    Частая задача — разбить строку на части и собрать обратно.

    Документация: Тип str

    Списки list

    Список — упорядоченная коллекция элементов. Списки изменяемы, поэтому подходят для накопления данных.

    Создание и доступ к элементам

    Списки могут хранить значения разных типов, но обычно удобнее хранить один тип.

    Добавление и удаление элементов

  • append(x) добавляет элемент в конец
  • insert(i, x) вставляет по индексу
  • pop() удаляет и возвращает элемент (по умолчанию последний)
  • Документация: Тип list

    Перебор с индексом

    Важный момент про копирование списка

    Присваивание не копирует список, а создаёт ещё одно имя для того же объекта.

    Если нужна копия:

    Кортежи tuple

    Кортеж похож на список, но неизменяем. Его удобно использовать, когда набор значений не должен меняться.

    Попытка изменить кортеж вызовет ошибку:

    Распаковка кортежа

    Очень частый паттерн в Python:

    Кортежи часто появляются при множественном присваивании и при возврате нескольких значений из функции.

    Документация: Тип tuple

    Множества set

    Множество — это коллекция уникальных элементов. У множества нет индексированного доступа, потому что порядок не гарантируется.

    Создание множества

    Пустое множество создаётся так:

    А вот {} — это пустой словарь, не множество.

    Уникальность и удаление дублей

    Операции над множествами

    Документация: Тип set

    Словари dict

    Словарь хранит соответствия ключ → значение. Это основная структура для моделирования объектов и быстрого поиска данных по ключу.

    Создание и доступ

    Ключи обычно делают строками, но можно использовать и числа, и кортежи. Главное требование: ключ должен быть неизменяемым.

    Безопасное чтение: get

    Если ключа нет, user["city"] вызовет ошибку. Часто удобнее get:

    Добавление, изменение и удаление

    Перебор словаря

    По умолчанию перебираются ключи:

    Пары ключ-значение удобнее перебирать через items():

    Документация: Тип dict

    Как выбрать подходящую коллекцию

    | Задача | Подходящая коллекция | Почему | |---|---|---| | Хранить текст | str | последовательность символов, много готовых методов | | Хранить изменяемый список значений | list | можно добавлять, удалять, менять элементы | | Хранить фиксированный набор значений | tuple | защищает от случайных изменений | | Удалить дубликаты, проверять уникальность | set | хранит только уникальные элементы | | Быстро находить значение по ключу | dict | сопоставление ключ → значение |

    Мини-практика: связываем коллекции с условиями и циклами

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

    Здесь одновременно используются:

  • цикл for
  • continue для пропуска
  • dict для накопления результата
  • len() для вычисления длины
  • Типичные ошибки новичков

  • Путать {} и set()
  • Ожидать, что у set есть индексы
  • Думать, что присваивание копирует список (b = a)
  • Забывать, что dict[key] падает, если ключа нет, и не использовать get() там, где это уместно
  • Итоги

    Теперь у вас есть базовый набор коллекций Python и понимание, когда они нужны:

  • последовательности str, list, tuple (индексы, срезы, перебор)
  • уникальные элементы в set
  • соответствия ключ-значение в dict
  • Эти структуры данных постоянно используются вместе с условиями и циклами, поэтому следующий шаг в практике — писать небольшие программы, которые читают ввод, собирают данные в коллекции и обрабатывают их.

    5. Функции, области видимости и обработка исключений

    Функции, области видимости и обработка исключений

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

  • функции (чтобы переиспользовать код и не повторяться)
  • области видимости (чтобы понимать, какие переменные где доступны)
  • обработку исключений (чтобы программа не падала на ошибках ввода и других проблемах)
  • !Схема помогает представить вызовы функций и локальные переменные как отдельные "кадры" выполнения

    Функции

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

    Документация: Определение функций в учебнике Python

    Зачем нужны функции

  • Убирают дублирование кода.
  • Делают программу читаемой: по имени функции понятно, что она делает.
  • Позволяют разбивать задачу на маленькие части.
  • Как объявить и вызвать функцию

    Функция объявляется через def.

    Правила:

  • Имя функции обычно пишут в стиле snake_case.
  • Тело функции выделяется отступом.
  • Параметры и аргументы

  • Параметр — имя в объявлении функции.
  • Аргумент — конкретное значение при вызове.
  • Возврат значения: return

    return завершает функцию и возвращает результат.

    Важно различать:

  • print() выводит на экран.
  • return возвращает значение в место вызова.
  • Пример ошибки мышления:

    Если return не написан, функция возвращает None.

    Несколько return и ранний выход

    Часто удобно выйти из функции сразу, когда результат уже известен.

    Значения параметров по умолчанию

    Можно задавать значения по умолчанию.

    Правило: параметры со значением по умолчанию обычно ставят после обязательных.

    Именованные аргументы

    При вызове можно явно указывать, какой параметр заполняете.

    Очень частая ошибка: изменяемые значения по умолчанию

    Если использовать список или словарь как значение по умолчанию, он создаётся один раз и будет общим для всех вызовов.

    Плохой пример:

    Правильный подход — использовать None и создавать список внутри:

    Докстроки: короткое описание функции

    Докстрока — это строка в начале функции, которая объясняет её назначение.

    Области видимости и время жизни переменных

    Область видимости — это часть программы, где имя переменной доступно.

    Документация: Модель выполнения: связывание имён

    Локальные и глобальные переменные

  • Локальные переменные создаются внутри функции и доступны только в ней.
  • Глобальные переменные создаются на верхнем уровне файла и доступны из функций только для чтения (по умолчанию).
  • Пример:

    Локальная переменная не видна снаружи:

    Почему важно избегать изменения глобальных переменных

    Глобальные изменения делают программу менее предсказуемой: функция начинает зависеть от внешнего состояния.

    Если всё же нужно изменить глобальную переменную, используется global, но в базовых программах лучше предпочитать return.

    Сравните:

    Второй вариант легче тестировать и понимать.

    Как Python ищет имя переменной

    Внутри функции Python обычно ищет имя так:

  • сначала среди локальных переменных функции;
  • затем среди переменных внешнего уровня (глобальных) в этом файле;
  • затем среди встроенных имён (например, len, print).
  • Практический вывод: не называйте переменные list, dict, str, len, чтобы не перекрывать встроенные функции и типы.

    Обработка исключений

    Исключение — это объект ошибки, который возникает во время выполнения. Если исключение не обработать, программа завершится с сообщением об ошибке.

    Документация: Ошибки и исключения (учебник Python)

    Типичный пример исключения

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

    try и except

    Чтобы программа не падала, используют конструкцию try/except.

    Рекомендация: ловите конкретные исключения, а не всё подряд.

    Несколько except

    Можно обрабатывать разные ошибки по-разному.

    else и finally

  • else выполняется, если в try не было исключения.
  • finally выполняется всегда, даже если была ошибка.
  • !Схема показывает порядок выполнения try/except/else/finally

    Когда стоит использовать исключения, а когда if

    Исключения полезны, когда:

  • ошибка может возникнуть из-за внешних данных (ввод пользователя, файлы, сеть);
  • проще попытаться сделать действие и обработать сбой, чем заранее проверять всё.
  • if полезнее, когда:

  • условие нормальное и ожидаемое (например, проверка диапазона: возраст не меньше 0).
  • Как создавать свои ошибки: raise

    Иногда вы хотите явно запретить некорректные данные.

    Это особенно удобно, если функцию будут использовать в разных местах.

    Пример: надёжная функция чтения возраста

    Соединим функции, циклы и исключения.

    Здесь:

  • цикл while повторяет запрос;
  • try/except защищает преобразование int(text);
  • проверка if age < 0 отсекает логически неверные данные;
  • return завершает функцию, когда всё корректно.
  • Типичные ошибки новичков

  • Путать print и return и ожидать значение там, где функция ничего не возвращает.
  • Изменять глобальные переменные вместо передачи данных через параметры и return.
  • Писать except: без указания типа и скрывать реальные ошибки.
  • Использовать [] или {} как значение по умолчанию у параметра.
  • Итоги

    Теперь у вас есть инструменты, которые делают код похожим на настоящие программы:

  • вы умеете объявлять функции, передавать параметры и возвращать значения через return;
  • понимаете разницу между локальными и глобальными переменными и почему важно контролировать области видимости;
  • умеете обрабатывать ошибки через try/except, использовать else/finally и при необходимости поднимать ошибки через raise.
  • Дальше эти навыки пригодятся в более крупных задачах: функции станут строительными блоками программы, а исключения помогут писать устойчивый код при работе с вводом и данными.

    6. Работа с файлами, модулями и пакетами

    Работа с файлами, модулями и пакетами

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

  • работа с файлами (чтение и запись данных);
  • разбиение кода на модули (импорт и повторное использование);
  • организация модулей в пакеты (структура проекта).
  • Работа с файлами

    Файл — это данные, сохранённые на диске (например, notes.txt, data.csv, config.json). В Python чтение и запись файлов обычно делают через функцию open().

    Документация: open()

    Пути к файлам и рабочая папка

    Чтобы открыть файл, нужен путь.

  • Относительный путь считается от текущей рабочей папки (где вы запускаете программу).
  • Абсолютный путь начинается от корня диска/файловой системы.
  • Для работы с путями удобен модуль pathlib.

    Документация: pathlib

    Пример:

    !Иллюстрация показывает, как устроены пути к файлам и от чего считается относительный путь

    Открытие файла: open() и режимы

    open() возвращает файловый объект, через который можно читать или писать.

    Чаще всего используют текстовый режим с кодировкой UTF-8.

    Проблема такого кода в том, что при ошибке до close() файл может остаться открытым. Поэтому почти всегда используют with.

    Контекстный менеджер with: правильный способ

    with гарантирует закрытие файла, даже если внутри возникло исключение.

    Таблица популярных режимов

    | Режим | Что делает | Если файла нет | Если файл есть | |---|---|---|---| | "r" | чтение | ошибка | читает | | "w" | запись | создаст | перезапишет полностью | | "a" | добавление в конец | создаст | допишет в конец | | "x" | создание нового файла | создаст | ошибка | | "b" | двоичный режим (например, изображения) | зависит от базового режима | зависит от базового режима |

    Примечания:

  • "r", "w", "a", "x" часто комбинируют с "b", например "rb".
  • По умолчанию открывается текстовый режим, поэтому чаще всего вы увидите просто "r" или "w".
  • Чтение из файла

    Основные способы:

  • f.read() читает весь файл целиком в одну строку.
  • Перебор for line in f: читает файл построчно (подходит для больших файлов).
  • Пример построчного чтения:

    rstrip("\n") убирает символ перевода строки в конце.

    Запись в файл

    Для записи используют write().

    Важно:

  • write() не добавляет перевод строки автоматически.
  • Если вы открыли файл в режиме "w", он будет очищен.
  • Кодировка: почему важно encoding="utf-8"

    Текстовые файлы хранят байты, и кодировка определяет, как эти байты превратить в символы.

    Практическое правило для учебных и большинства прикладных задач:

  • при работе с текстом явно указывайте encoding="utf-8".
  • Пример:

    Ошибки при работе с файлами и их обработка

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

    Типичный шаблон:

    Модули

    Модуль — это обычный файл .py, который можно импортировать.

    Документация: Модули

    Зачем нужны модули

  • чтобы не держать весь код в одном файле;
  • чтобы переиспользовать функции и константы;
  • чтобы отделить логику от запуска программы.
  • Импорт: основные варианты

    Импорт целого модуля:

    Импорт с псевдонимом:

    Импорт конкретного имени:

    Рекомендация: избегайте from module import *, потому что становится неясно, какие имена откуда взялись.

    Где Python ищет модуль

    Когда вы пишете import something, Python ищет модуль:

  • среди модулей стандартной библиотеки;
  • среди установленных пакетов в окружении (поэтому важно venv из первой статьи);
  • среди файлов и папок в путях поиска, включая папку запуска.
  • Если вы назовёте свой файл, например, json.py, то можете случайно «перекрыть» стандартный модуль json. Это частая ошибка новичков.

    __name__ и точка входа

    Один и тот же файл может:

  • импортироваться как модуль;
  • запускаться как программа.
  • Для этого используют проверку if __name__ == "__main__":.

    Что это даёт:

  • при импорте add будет доступна, но печать не выполнится;
  • при запуске файла напрямую выполнится блок под if.
  • !Схема показывает разницу между запуском файла и импортом как модуля

    Пакеты

    Пакет — это способ сгруппировать модули в папку со структурой.

    Документация: Пакеты

    Структура простого пакета

    Один из типичных вариантов структуры проекта:

    Смысл файлов:

  • myapp/ — папка пакета;
  • __init__.py — файл, который делает папку пакетом (и может быть пустым);
  • utils.py, storage.py — модули.
  • Импорт из пакета

    Если main.py рядом с папкой myapp, то можно импортировать так:

    Внутри самого пакета часто используют относительные импорты.

    Пример: внутри myapp/storage.py импорт из utils.py:

    Практический совет:

  • относительные импорты удобны внутри пакета;
  • для запуска модулей внутри пакета часто используют запуск как модуль: python -m myapp.storage (в этом случае Python лучше понимает структуру пакета).
  • Сторонние пакеты, pip и зависимости

    Кроме стандартной библиотеки, вы можете подключать сторонние пакеты через pip.

    Документация: pip user guide

    Базовый сценарий работы в виртуальном окружении:

    Чтобы зафиксировать зависимости проекта, часто сохраняют список в файл requirements.txt.

    Пример команды для получения списка установленных пакетов:

    На практике вывод pip freeze перенаправляют в файл и затем устанавливают зависимости из него.

    Мини-пример: читаем файл и собираем частоты слов

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

    Что здесь используется:

  • Path("data") / "text.txt" для пути;
  • with open(...) для безопасной работы с файлом;
  • dict и get() для накопления результата;
  • if __name__ == "__main__": чтобы модуль можно было и импортировать, и запускать.
  • Итоги

    Теперь вы умеете строить более «реальные» программы:

  • читать и записывать файлы через open(), выбирать режимы и работать через with;
  • понимать важность encoding="utf-8" для текста;
  • обрабатывать типичные файловые ошибки через исключения;
  • разносить код по модулям и подключать его через import;
  • организовывать модули в пакеты и использовать относительные импорты;
  • подключать сторонние пакеты через pip в виртуальном окружении.
  • 7. Отладка, тестирование и основы стиля кода

    Отладка, тестирование и основы стиля кода

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

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

    Отладка: как искать ошибки в программе

    Отладка — это процесс поиска причины, по которой программа:

  • падает с ошибкой;
  • работает, но выдаёт неправильный результат;
  • зависает или выполняется слишком долго.
  • Типы проблем: синтаксис и выполнение

  • Синтаксическая ошибка возникает, когда Python не может прочитать код.
  • Ошибка выполнения возникает, когда код читается нормально, но ломается при запуске (например, деление на ноль, неправильный тип данных).
  • Пример синтаксической ошибки:

    Пример ошибки выполнения:

    Traceback: главное, что нужно уметь читать

    Когда возникает исключение и оно не обработано, Python печатает traceback — список вызовов, который показывает:

  • в каком файле произошла ошибка;
  • на какой строке;
  • через какие функции программа пришла к этой строке;
  • тип исключения и сообщение.
  • Пример:

    При запуске вы увидите ValueError. В traceback важно смотреть:

  • на последнюю строку (тип исключения и сообщение);
  • на самую нижнюю строку вашего кода в стеке вызовов (обычно там ошибка проявилась);
  • на строки выше, чтобы понять, откуда пришли данные.
  • Документация про встроенные исключения: Built-in Exceptions

    Мини-алгоритм поиска ошибки

  • Воспроизведите ошибку стабильно (одни и те же действия дают одну и ту же проблему).
  • Упростите пример: уберите всё лишнее, оставьте минимальный код, где проблема остаётся.
  • Прочитайте traceback и найдите строку, где ошибка возникла.
  • Проверьте входные данные на этой строке: типы, значения, пустые строки, None.
  • Исправьте и снова воспроизведите.
  • Отладка через print()

    Самый простой инструмент — временно распечатать значения.

    Так быстро видно, что в список попала строка, и сложение ломается.

    Практические советы:

  • Печатайте и значение, и тип через type().
  • Печатайте ключевые точки: вход в функцию, результат вычисления, значения в цикле.
  • Удаляйте отладочные print() после исправления (иначе они превращаются в шум).
  • Встроенный отладчик pdb и breakpoint()

    Когда одних print() недостаточно, удобно остановить программу в нужном месте и пошагово выполнять код.

    В Python есть встроенный отладчик pdb. Самый простой способ поставить точку остановки — вызвать breakpoint().

    После остановки доступны базовые команды:

  • l показать код вокруг текущей строки
  • p имя вывести значение (например, p data)
  • n выполнить текущую строку и перейти к следующей
  • s зайти внутрь вызываемой функции
  • c продолжить выполнение до следующей остановки
  • q выйти из отладчика
  • Документация: pdb — The Python Debugger

    Отладка в редакторе (IDE)

    Если вы используете Visual Studio Code или PyCharm, у них есть графический отладчик:

  • ставите breakpoint кликом слева от строки;
  • запускаете в режиме Debug;
  • смотрите значения переменных, стек вызовов, выполняете шаги.
  • Это удобнее pdb, но полезно уметь оба подхода.

    Тестирование: как проверять код автоматически

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

    Зачем тесты нужны даже в маленьких проектах:

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

    Что удобнее всего тестировать

    Лучше всего тестируются функции, которые:

  • получают данные через параметры;
  • возвращают результат через return;
  • не зависят от input(), файлов и глобальных переменных.
  • Если функция читает файл или спрашивает ввод, её можно разделить:

  • одна часть читает данные;
  • другая обрабатывает данные (и именно её удобно тестировать).
  • assert: базовая проверка ожидания

    assert проверяет условие. Если оно ложно, возникает AssertionError.

    Важно:

  • assert полезен в учебных примерах и простых проверках.
  • полноценные тесты обычно пишут в тестовом фреймворке, чтобы видеть отчёт по многим проверкам.
  • unittest: стандартный фреймворк тестирования

    В стандартной библиотеке Python есть модуль unittest.

    Документация: unittest — Unit testing framework

    Пример структуры проекта:

  • calc.py код
  • test_calc.py тесты
  • calc.py:

    test_calc.py:

    Запуск тестов из папки проекта:

    Или точечно:

    Паттерн AAA: Arrange, Act, Assert

    Хороший unit-тест обычно содержит три части:

  • Arrange подготовка данных
  • Act вызов тестируемой функции
  • Assert проверка результата
  • Это помогает писать тесты читаемо.

    Что тестировать в первую очередь

  • граничные случаи (пустые списки, ноль, отрицательные значения);
  • некорректный ввод (проверка, что выбрасывается исключение);
  • типичные кейсы, которые реально встречаются в задаче.
  • Сторонние инструменты тестирования

    В реальных проектах часто используют pytest, но для базового курса достаточно unittest.

    Если хотите посмотреть, как выглядит альтернативный подход:

  • pytest Documentation
  • Основы стиля кода: как писать читаемо

    Стиль кода — это правила оформления, которые делают программы:

  • понятными для вас через неделю;
  • понятными для других;
  • проще поддерживаемыми.
  • Главный документ по стилю для Python — PEP 8.

  • PEP 8 — Style Guide for Python Code
  • Базовые правила PEP 8, которые стоит применить сразу

  • Отступы: 4 пробела.
  • Имена:
  • - функции и переменные: snake_case - классы: CamelCase - константы: UPPER_CASE
  • Пробелы вокруг операторов: a + b, а не a+b.
  • Пустые строки между крупными блоками (например, между функциями) улучшают чтение.
  • Импорты: порядок и читаемость

    Часто используемый порядок:

  • стандартная библиотека
  • сторонние пакеты
  • ваши модули проекта
  • Плохой пример:

    Лучше:

    Докстроки и комментарии

  • Комментарии объясняют почему, а не что (что видно из кода).
  • Докстроки описывают назначение функции и её параметры.
  • Документация: PEP 257 — Docstring Conventions

    Автоформатирование и линтеры

    Чтобы не спорить со стилем вручную, используют инструменты:

  • форматтер приводит код к единому виду;
  • линтер находит подозрительные места и стилистические ошибки.
  • Популярные варианты:

  • black форматирование
  • - Black documentation
  • ruff быстрый линтер
  • - Ruff documentation

    Пример использования (в активированном виртуальном окружении):

    Практическая идея для учебных проектов:

  • сначала доведите программу до корректной работы;
  • затем прогоните форматирование;
  • затем включайте линтер и исправляйте предупреждения постепенно.
  • Как связать всё вместе: отладка + тесты + стиль

    Один из удобных рабочих процессов для небольших программ:

  • Напишите функцию, которая решает маленькую задачу.
  • Запустите на нескольких примерах.
  • Если ошибка:
  • - прочитайте traceback; - локализуйте место; - используйте print() или breakpoint().
  • Когда исправили — добавьте unit-тест на этот случай.
  • Приведите код к стилю (автоформатирование помогает).
  • Итоги

    Теперь у вас есть три практических навыка, которые превращают набор знаний Python в уверенную разработку:

  • вы умеете читать traceback и применять простую отладку через print() и breakpoint();
  • понимаете, зачем нужны тесты, и умеете писать базовые unit-тесты на unittest;
  • знаете ключевые правила стиля (PEP 8) и понимаете роль форматтеров и линтеров.
  • Эти навыки особенно важны, когда вы начинаете писать программы из нескольких модулей, работать с файлами и расширять проекты: ошибки становятся разнообразнее, а поддерживать код без тестов и стиля становится заметно сложнее.