Python: основы языка

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

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

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

Что такое Python

Python — это язык программирования общего назначения: на нём пишут веб‑сервисы, скрипты автоматизации, анализируют данные, обучают модели машинного обучения, создают ботов и инструменты для разработчиков.

Почему Python часто выбирают для старта:

  • Читаемый синтаксис: код похож на обычный текст и проще воспринимается.
  • Большая экосистема библиотек: можно решать много задач «из коробки».
  • Кроссплатформенность: работает на Windows, macOS и Linux.
  • Важная особенность Python: код выполняется интерпретатором. Это программа, которая читает ваш код и выполняет его.

    Версии Python и что устанавливать

    Сегодня основная ветка — Python 3. Для обучения и новых проектов используйте Python 3.

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

  • Устанавливайте актуальную стабильную версию Python 3 с официального сайта.
  • Не используйте Python 2: он устарел и не поддерживается.
  • Полезные ссылки:

  • Официальный сайт Python
  • Скачивание Python
  • Документация Python
  • Способы писать и запускать Python‑код

    В Python обычно работают в одном (или нескольких) режимах:

  • Интерактивный режим (REPL): вводите команды по одной строке и сразу видите результат.
  • Скрипт (.py файл): пишете программу в файле и запускаете её.
  • Блокнот (notebook): удобно для экспериментов и анализа данных.
  • В рамках курса базовым будет подход со скриптами и запуском из терминала.

    Установка Python

    Windows

  • Скачайте установщик на странице Скачивание Python.
  • Запустите установку.
  • Важно: отметьте опцию добавления Python в PATH (обычно называется Add python.exe to PATH).
  • Проверка установки (в PowerShell или cmd):

    Иногда на Windows команда может быть такой:

    macOS

    На macOS системный Python может отсутствовать или быть не той версии. Рекомендуемый путь — установить официальный пакет с Скачивание Python или использовать менеджер пакетов.

    Проверка:

    Linux

    Чаще всего Python уже установлен. Если нет — установите через пакетный менеджер вашего дистрибутива.

    Проверка:

    Редактор кода или IDE

    Для начала важны две вещи: подсветка синтаксиса и удобный запуск.

    Популярные варианты:

  • Visual Studio Code + расширение Python
  • PyCharm
  • Для экспериментов и учебных заметок:

  • Jupyter
  • Если вы совсем не уверены в выборе, берите VS Code: он лёгкий, бесплатный и хорошо подходит для обучения.

    Терминал и рабочая папка проекта

    Терминал (командная строка) — это место, где вы запускаете команды и программы. Вам понадобится навык:

  • перейти в папку проекта
  • запустить Python
  • установить библиотеку
  • Пример: создать папку и перейти в неё (macOS/Linux):

    В Windows PowerShell аналогично:

    Первый запуск: REPL и скрипт

    REPL

    Запуск:

    Или на macOS/Linux часто так:

    Вы увидите приглашение ввода >>>. Попробуйте:

    Выход из REPL:

  • macOS/Linux: Ctrl+D
  • Windows: Ctrl+Z, затем Enter
  • Скрипт

    Создайте файл hello.py с содержимым:

    Запуск:

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

    В проектах Python часто используются сторонние библиотеки. Разные проекты могут требовать разные версии библиотек. Чтобы зависимости одного проекта не ломали другой, используют виртуальные окружения.

    Идея простая:

  • у каждого проекта своя «песочница»
  • библиотеки ставятся внутрь этой песочницы
  • системный Python остаётся чистым
  • Для базовой работы достаточно встроенного модуля venv.

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

  • venv — создание виртуальных окружений
  • !Схема показывает, что у каждого проекта свои зависимости в отдельном venv

    Создание и активация venv

    Сначала зайдите в папку проекта.

    Создать окружение (в папке появится каталог .venv):

    Активация:

  • Windows (PowerShell):
  • Windows (cmd):
  • macOS/Linux:
  • После активации в терминале обычно появляется префикс с именем окружения, например (.venv).

    Выход (деактивация):

    pip и установка библиотек

    pip — стандартный инструмент для установки пакетов.

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

  • pip — документация
  • Проверить версию pip:

    Установить пакет (пример):

    Обновить pip:

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

    Как понимать ошибки установки и запуска

    Частые ситуации:

  • Команда python не найдена
  • - Python не установлен или не добавлен в PATH. - На macOS/Linux попробуйте python3. - На Windows иногда удобнее использовать py.

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

  • Не совпадают версии Python
  • - В системе может быть несколько интерпретаторов. - Всегда проверяйте python --version в том же терминале, где запускаете проект.

    Минимальный рабочий процесс для каждого проекта

    Держите «шаблон» действий:

  • Создать папку проекта.
  • Создать виртуальное окружение: python -m venv .venv.
  • Активировать окружение.
  • Установить нужные пакеты: python -m pip install ....
  • Запускать код: python file.py.
  • В следующих материалах мы начнём писать программы: переменные, типы данных, ввод/вывод, условия и циклы — всё в рамках этого окружения.

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

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

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

    Как Python «читает» ваш код

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

    Минимальный пример файла main.py:

    Запуск из терминала (как в прошлой теме):

    Базовый синтаксис

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

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

    Пример с условием:

    Правила, которые важно запомнить:

  • После конструкций вроде if, for, while, def ставится двоеточие :.
  • Внутри блока все строки должны иметь одинаковый отступ.
  • Чаще всего используют 4 пробела на один уровень отступа.
  • Если отступы «сломаны», вы получите ошибку IndentationError.

    Комментарии

    Комментарии нужны, чтобы пояснять код людям. Интерпретатор их игнорирует.

    Длинные строки кода

    Если строка кода получается слишком длинной, её можно переносить внутри скобок (), [], {}:

    Переменные

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

    Пример:

    !Иллюстрация показывает, что переменная в Python — это ссылка на объект со значением

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

    Имена переменных (идентификаторы) обычно пишут в стиле snake_case:

  • Можно использовать буквы, цифры и _, но имя не может начинаться с цифры.
  • Регистр важен: name и Name — разные переменные.
  • Нельзя использовать ключевые слова языка, например if, for, class.
  • Рекомендации по стилю:

  • Делайте имена говорящими: total_price, user_age.
  • Избегайте слишком коротких имён вроде a, b, если это не счётчик в коротком цикле.
  • Источник по стилю кода: PEP 8 — Style Guide for Python Code.

    Присваивание и переприсваивание

    В Python значение присваивают оператором =:

    Можно присвоить несколько значений сразу:

    А ещё есть сокращённые операции:

    Динамическая типизация

    Python не требует заранее объявлять тип переменной. Тип хранится у значения.

    Функция type() показывает тип объекта.

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

    В Python много встроенных типов. На старте важнее всего уверенно понимать числа, строки, булевы значения и None.

    Краткая таблица типов

    | Тип | Как выглядит | Пример | Где используется | |---|---|---|---| | int | целое число | 42, -7 | счётчики, количество, индексы | | float | число с точкой | 3.14, -0.5 | измерения, расчёты | | bool | логическое значение | True, False | условия, проверки | | str | строка | "hello", 'мир' | текст, сообщения, данные из ввода | | NoneType | «нет значения» | None | отсутствие данных, значение по умолчанию |

    Документация по встроенным типам: Built-in Types.

    Числа: int и float

    Примеры операций:

    Полезное замечание: оператор / возвращает число с плавающей точкой даже тогда, когда деление «нацело».

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

    bool принимает только два значения: True и False.

    Чаще всего bool появляется в сравнении:

    Связки условий:

    Важно: and, or, not — это ключевые слова, а не символы.

    Строки: str

    Строки можно писать в одинарных или двойных кавычках:

    #### Конкатенация и повторение

    #### Длина строки

    #### Индексация

    У строки есть позиции (индексы), начинающиеся с нуля:

    Если обратиться к несуществующему индексу, возникнет ошибка IndexError.

    #### Форматирование строк через f-строки

    Самый удобный способ подставить значения в текст:

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

    None означает «значения нет».

    Пример:

    Где это встречается:

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

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

    Осторожно: не любую строку можно превратить в число.

    Ввод и вывод: input() и print()

    Вывод

    print() печатает значения в консоль:

    Ввод

    input() читает строку из консоли. Важно: результат input() всегда имеет тип str.

    Если нужно число, делайте преобразование:

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

  • NameError: вы используете переменную, которой не существует (например, опечатка в имени).
  • TypeError: вы применили операцию к несовместимым типам (например, сложили строку и число).
  • ValueError: тип подходит, но значение нельзя преобразовать (например, int("abc")).
  • IndentationError: нарушены отступы.
  • Если ошибка возникла, читайте:

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

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

    3. Операторы и выражения: арифметика, сравнение, логика

    Операторы и выражения: арифметика, сравнение, логика

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

    Что такое выражение

    Выражение — это фрагмент кода, который вычисляется в значение.

    Примеры выражений:

    Чаще всего выражение состоит из:

  • операторов: +, -, *, ==, and и других
  • операндов: значений и переменных, к которым применяется оператор
  • Пример:

    Арифметические операторы

    Арифметика в Python работает с числами int и float.

    Основные операторы

    | Оператор | Назначение | Пример | Результат | |---|---|---|---| | + | сложение | 7 + 5 | 12 | | - | вычитание | 7 - 5 | 2 | | | умножение | 7 5 | 35 | | / | деление | 7 / 2 | 3.5 | | // | целочисленное деление | 7 // 2 | 3 | | % | остаток от деления | 7 % 2 | 1 | | | возведение в степень | 2 3 | 8 |

    Ключевые моменты:

  • Оператор / всегда возвращает float, даже если делится нацело.
  • Оператор // отбрасывает дробную часть результата деления.
  • Остаток % в практических задачах

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

    Смешивание int и float

    Если в выражении участвует float, результат обычно будет float:

    Операторы со строками

    Строки поддерживают:

  • + для склеивания
  • * для повторения
  • Но строку и число складывать нельзя:

    Операторы сравнения

    Операторы сравнения вычисляются в bool: True или False.

    | Оператор | Смысл | Пример | |---|---|---| | == | равно | x == 10 | | != | не равно | x != 10 | | < | меньше | x < 10 | | <= | меньше или равно | x <= 10 | | > | больше | x > 10 | | >= | больше или равно | x >= 10 |

    Пример:

    Сравнение строк

    Строки сравниваются посимвольно (по порядку символов):

    Важно: сравнение чувствительно к регистру.

    Цепочки сравнений

    Python умеет писать цепочки сравнений так, как это делается в математике:

    Запись 1 < x < 10 читается как: x больше 1 и меньше 10.

    == и =

    Новички часто путают:

  • = это присваивание
  • == это сравнение
  • Логические операторы: and, or, not

    Логические операторы помогают собирать несколько условий в одно.

    | Оператор | Смысл | Пример | |---|---|---| | and | и | age >= 18 and has_ticket | | or | или | is_admin or is_moderator | | not | не | not is_blocked |

    Пример:

    Приоритет и скобки в логике

    Скобки помогают явно указать, что должно вычисляться вместе:

    Короткое вычисление

    Python вычисляет and и or так, чтобы не делать лишнюю работу:

  • A and B: если A ложно, B не вычисляется
  • A or B: если A истинно, B не вычисляется
  • Это важно, когда правая часть может вызвать ошибку.

    Порядок выполнения операторов

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

    !Схема показывает, какие операторы выполняются раньше, а какие позже

    Практические правила:

  • Сначала скобки (...).
  • Затем степень **.
  • Потом умножение и деление *, /, //, %.
  • Затем сложение и вычитание +, -.
  • Потом сравнения.
  • Потом логика: not, затем and, затем or.
  • Пример:

    Частые ошибки и как их избежать

  • Смешали строку и число в +
  • - Решение: приводите типы, например str(number).
  • Использовали = вместо == в сравнении
  • - Решение: помните, что = только присваивает.
  • Сравниваете float на точное равенство
  • - Иногда результат вычислений с float может быть не точно ожидаемым из-за представления дробей в памяти. - Решение на старте: старайтесь не проверять сложные дробные вычисления на точное ==, либо округляйте через round().

    Где посмотреть официальное описание

  • Python Language Reference: Expressions
  • Что дальше

    Вы научились строить выражения из арифметики, сравнений и логики и понимать, в каком порядке они вычисляются. В следующей теме эти знания станут основой для ветвления: мы начнём писать условия if, elif, else и превращать проверки в поведение программы.

    4. Управляющие конструкции: if, for, while

    Управляющие конструкции: if, for, while

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

    Основная идея такая:

  • if выбирает, какой блок кода выполнить.
  • for повторяет действия для каждого элемента последовательности.
  • while повторяет действия, пока условие истинно.
  • !Общая схема того, как if/for/while управляют выполнением кода

    Условное ветвление if, elif, else

    Конструкция if позволяет выполнить код только если условие истинно (True). Условием обычно выступает выражение сравнения или логическое выражение.

    Базовый if

    Ключевые моменты:

  • После условия ставится :.
  • Внутри блока одинаковый отступ (обычно 4 пробела).
  • Если условие ложно (False), блок пропускается.
  • Ветка else

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

    Несколько вариантов: elif

    Когда вариантов больше двух, используют elif (сокращение от else if).

    Как это читается:

  • Python проверяет условия сверху вниз.
  • Выполняется первый блок, условие которого истинно.
  • Остальные ветки не проверяются.
  • Вложенные условия

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

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

  • Путают = и ==.
  • Забывают двоеточие : после условия.
  • Делают разные отступы внутри одного блока.
  • Официальный материал по управляющим конструкциям: Python Tutorial: More Control Flow Tools.

    Цикл for: перебор последовательностей

    for в Python чаще всего означает перебор элементов (а не цикл “пока условие”). Он отлично подходит, когда заранее понятно, что именно перебираем.

    Перебор списка

    Здесь name на каждой итерации получает очередной элемент списка.

    range() для повторения N раз

    Если нужно повторить действие фиксированное число раз, обычно используют range().

    Что важно понимать про range(5):

  • range(5) генерирует числа 0, 1, 2, 3, 4.
  • Верхняя граница не включается.
  • Частые формы:

  • range(n) даёт числа от 0 до n - 1.
  • range(start, stop) даёт числа от start до stop - 1.
  • range(start, stop, step) задаёт шаг.
  • Документация: range.

    Перебор с индексом: enumerate()

    Иногда нужен и индекс, и значение.

    По умолчанию индексы начинаются с 0.

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

    Цикл while: повторение, пока условие истинно

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

    Пример: ввод до правильного значения

    Опасность: бесконечный цикл

    Если условие никогда не станет ложным, цикл будет выполняться бесконечно.

    Чтобы цикл завершался, обычно делают одно из двух:

  • Меняют переменные в теле цикла так, чтобы условие стало ложным.
  • Используют break для принудительного выхода.
  • Управление циклом: break и continue

    break — выйти из цикла

    Как только выполнится break, цикл заканчивается полностью.

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

    Здесь число 3 не будет напечатано, потому что continue пропускает остаток тела цикла.

    else у циклов: редкая, но полезная возможность

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

    Пример: поиск элемента

    Здесь else не выполнится, потому что цикл оборвётся через break, когда найдёт 9.

    Практические шаблоны

    Валидация ввода

    Подсчёт суммы

    Условие внутри цикла

    Как выбрать между for и while

  • Выбирайте for, если перебираете элементы или делаете действие фиксированное число раз.
  • Выбирайте while, если повторение зависит от условия, и заранее неизвестно, сколько будет итераций.
  • Что дальше

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

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

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

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

    Коллекции почти всегда используются вместе с for и условиями:

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

    В Python самые базовые коллекции такие:

    | Коллекция | Что хранит | Упорядочена | Можно менять | Особенность | |---|---|---|---|---| | str | символы | да | нет | текст | | list | элементы | да | да | универсальный контейнер | | tuple | элементы | да | нет | часто используют как фиксированную группу значений | | set | элементы | нет | да | только уникальные значения | | dict | пары ключ: значение | да | да | быстрый доступ по ключу |

    !Сводная схема различий между основными коллекциями

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

    Некоторые операции работают у многих коллекций:

  • len(x) возвращает количество элементов
  • for item in x: перебирает элементы
  • value in x проверяет принадлежность
  • Пример:

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

  • упорядоченность означает, что элементы имеют позицию
  • индексация означает, что можно обратиться по индексу x[0]
  • изменяемость означает, что коллекцию можно менять без создания новой
  • Строки str как коллекция символов

    Строка в Python это текст, но одновременно и последовательность символов.

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

    Правило среза a:b такое:

  • a включается
  • b не включается
  • Строки неизменяемы

    Нельзя “поменять символ” внутри строки:

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

    Полезная документация: str

    Списки list

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

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

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

    Изменяемость списка

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

    append() и extend()

  • append(x) добавляет один элемент x
  • extend(iterable) добавляет все элементы из последовательности
  • Перебор списка

    Полезная документация: list

    Кортежи tuple

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

    Примеры

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

    Распаковка особенно полезна в циклах и при возврате нескольких значений.

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

    Полезная документация: tuple

    Множества set

    Множество хранит только уникальные значения и не гарантирует порядок. Оно идеально подходит для удаления дублей и операций над наборами.

    Создание и уникальность

    Пустое множество создают не через {}:

    Проверка принадлежности

    Проверка in у множества обычно быстрее, чем у списка, и часто используется в условиях.

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

    Полезная документация: set

    Словари dict

    Словарь хранит пары ключ: значение. Это основная структура для данных вида “характеристика → значение”: профиль пользователя, настройки, статистика.

    Создание и доступ по ключу

    Изменение и добавление

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

    Если обратиться к отсутствующему ключу через [], будет KeyError. Для безопасного доступа используйте get().

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

    Требования к ключам

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

    Список нельзя использовать как ключ:

    Полезная документация: dict

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

    Выбор можно свести к простым правилам:

  • Если нужен текст, берите str.
  • Если нужен упорядоченный набор, который будет меняться, берите list.
  • Если нужен упорядоченный набор, который не должен меняться, берите tuple.
  • Если нужны уникальные значения и быстрые проверки in, берите set.
  • Если нужен доступ к значениям по ключу, берите dict.
  • Мини-практика: собираем всё вместе с циклами и условиями

    Удаление дублей из списка через set

    Если нужен результат снова списком:

    Подсчёт частоты элементов через dict

    Что дальше

    Теперь у вас есть базовые контейнеры для данных. На них строятся более “реальные” программы: обработка вводимых данных, поиск, фильтрация, статистика. Следующий логичный шаг после коллекций это функции и разбиение программы на части, чтобы код был короче, понятнее и переиспользуемым.

    6. Функции и область видимости переменных

    Функции и область видимости переменных

    В прошлых темах вы научились писать условия и циклы и работать с коллекциями (list, dict, set). Следующий шаг к более “взрослому” коду — функции. Они помогают:

  • не дублировать одинаковые куски кода
  • делать программу понятнее за счёт именованных шагов
  • повторно использовать логику в разных местах
  • проще тестировать и менять части программы
  • Что такое функция

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

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

    Ключевые элементы:

  • def — ключевое слово для объявления функции
  • имя функции — по нему мы вызываем функцию
  • круглые скобки () — место для параметров
  • двоеточие : и отступы — блок тела функции
  • Параметры и аргументы

    Термины:

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

    Здесь name — параметр, а строка "Анна" — аргумент.

    Несколько параметров

    Позиционные и именованные аргументы

    Python позволяет передавать аргументы двумя способами:

  • позиционно — по порядку
  • по имени — через param=value
  • Практическое правило:

  • позиционные аргументы пишутся раньше именованных
  • Возврат значения: return

    return делает две вещи:

  • возвращает значение наружу, в место вызова
  • завершает выполнение функции
  • Если return не написан, функция возвращает None:

    Докстроки: как документировать функцию

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

    Докстроки важны, потому что:

  • помогают вам и команде читать код
  • отображаются в подсказках IDE
  • их можно получить через help()
  • Официальный материал: Defining Functions

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

    Область видимости отвечает на вопрос: где в коде “видно” имя переменной и к какому значению оно относится.

    Главное правило:

  • переменные, созданные внутри функции, обычно локальные и не видны снаружи
  • Локальная и глобальная области

  • локальная область — имена внутри текущей функции
  • глобальная область — имена на уровне файла (модуля)
  • Здесь локальная x не меняет глобальную x — это разные имена в разных областях.

    Правило поиска имён (LEGB)

    Когда Python встречает имя, он ищет его в порядке:

  • L (Local) — локальная область функции
  • E (Enclosing) — внешняя функция (если есть вложенные функции)
  • G (Global) — глобальная область файла
  • B (Built-in) — встроенные имена (например, len, print)
  • !Диаграмма показывает порядок поиска имён при обращении к переменной

    Про области и пространства имён: Python Scopes and Namespaces

    Вложенные функции и nonlocal

    Функции можно объявлять внутри других функций. Тогда появляется уровень Enclosing.

    Здесь:

  • count принадлежит функции outer
  • inner() меняет count из внешней (enclosing) области
  • без nonlocal выражение count += 1 привело бы к ошибке, потому что Python решил бы, что count — локальная переменная inner()
  • Официально: The nonlocal statement

    Изменение глобальных переменных и global

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

    Важно:

  • global стоит использовать редко
  • чаще лучше возвращать новое значение через return и присваивать снаружи
  • Официально: The global statement

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

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

    Ловушка для новичков: изменяемые значения по умолчанию (например, список) создаются один раз — в момент объявления функции — и затем переиспользуются.

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

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

    Практический пример: функции + коллекции + циклы

    Сделаем функцию, которая считает частоты слов (с учётом того, что вы уже знаете dict, for, get()).

    Польза такого подхода:

  • логика подсчёта изолирована в одном месте
  • её легко переиспользовать в другой программе
  • функцию проще тестировать, чем большой скрипт
  • Что дальше

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

    7. Модули, импорт, ввод-вывод и обработка исключений

    Модули, импорт, ввод-вывод и обработка исключений

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

  • научимся разносить код по файлам и подключать его через import
  • разберёмся, как использовать стандартную библиотеку Python
  • освоим ввод-вывод через файлы
  • научимся ловить ошибки и корректно реагировать на них с помощью исключений
  • !Наглядная схема: модуль — это файл, пакет — это папка, импорт связывает их

    Модули и пакеты

    Что такое модуль

    Модуль в Python — это обычный файл с кодом и расширением .py.

    Пример структуры:

  • utils.py — модуль
  • всё, что объявлено в utils.py (функции, переменные), можно импортировать в main.py
  • Пример utils.py:

    Пример main.py:

    Важно: когда вы пишете utils.is_even, вы явно показываете, из какого модуля пришла функция.

    Что такое пакет

    Пакет — это папка с Python-кодом. Чаще всего пакет содержит файл __init__.py (в современных версиях Python он не всегда обязателен, но в учебных проектах полезен для ясности).

    Пример:

    Импорт из пакета:

    Официально:

  • Модули в Python
  • Система импорта
  • Импорт: основные варианты

    import module

    Самый базовый и безопасный стиль:

    Плюсы:

  • понятное происхождение имён (math.sqrt)
  • меньше риск конфликтов имён
  • Документация:

  • math — математические функции
  • from module import name

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

    Это удобно, но повышает риск конфликтов (если sqrt уже есть в вашем коде).

    Псевдонимы через as

    Часто используют для сокращения или устранения конфликта имён:

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

  • datetime — типы для дат и времени
  • Импорт нескольких имён

    Почему обычно не используют from module import *

    from module import * затягивает в ваш файл много имён сразу и делает код менее прозрачным.

    Проблемы:

  • непонятно, откуда взялось имя
  • легко затереть своё имя импортированным
  • сложнее читать и сопровождать
  • Как Python находит модули

    Когда вы пишете import something, Python ищет модуль в нескольких местах, включая:

  • текущую папку проекта
  • стандартную библиотеку
  • установленные пакеты в активном виртуальном окружении
  • Практический вывод:

  • запускайте скрипт из корня проекта
  • используйте виртуальные окружения (venv), чтобы зависимости проекта были изолированы
  • Официально:

  • sys.path — где Python ищет модули
  • Стандартная библиотека и сторонние пакеты

    Стандартная библиотека

    Python поставляется со множеством модулей из коробки. Часто используемые:

  • math — математика
  • random — случайные числа
  • datetime — дата и время
  • pathlib — работа с путями
  • json — JSON
  • Официальный каталог:

  • Стандартная библиотека Python
  • Сторонние пакеты

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

    Команды (после активации .venv):

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

  • pip — документация
  • Ввод-вывод: работа с файлами

    До этого мы использовали input() и print(). Но реальные программы часто читают и записывают данные в файлы.

    Абсолютный минимум: open()

    Файл открывают функцией open().

  • режим чтения: "r"
  • режим записи: "w" (перезапишет файл)
  • режим добавления: "a" (добавит в конец)
  • кодировку в текстовом режиме часто задают явно: encoding="utf-8"
  • Официально:

  • open — встроенная функция
  • Почему важно использовать with

    Файл нужно закрывать. Конструкция with закрывает файл автоматически, даже если произошла ошибка.

    Чтение текста целиком:

    Чтение построчно:

    Запись текста:

    Пути к файлам и pathlib

    Чтобы удобнее работать с путями (особенно на разных ОС), используйте pathlib.

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

  • pathlib — объектные пути
  • Частые ошибки при работе с файлами

  • FileNotFoundError: файла нет или путь неверный
  • PermissionError: нет прав на чтение/запись
  • «кракозябры» в тексте: неправильная кодировка (часто помогает encoding="utf-8")
  • Исключения: как Python сообщает об ошибках

    Что такое исключение

    Исключение — это механизм Python, который прерывает обычное выполнение программы и сообщает: произошла ошибка.

    Пример:

    Это вызовет ValueError, потому что строку "abc" нельзя преобразовать в число.

    Зачем обрабатывать исключения

    Обработка исключений нужна, чтобы:

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

  • Ошибки и исключения
  • try / except / else / finally

    Базовая обработка через try и except

    Что здесь происходит:

  • код в try выполняется обычно
  • если возникает ValueError, управление переходит в except ValueError
  • Несколько типов исключений

    else: когда ошибки не было

    else выполняется только если блок try прошёл без исключений.

    finally: выполнится всегда

    finally выполняется и при успехе, и при ошибке. Полезно для освобождения ресурсов.

    На практике для файлов обычно лучше использовать with, чтобы не писать finally вручную.

    Как правильно «поднимать» ошибки: raise

    Иногда ошибка не случайна, а означает, что входные данные неверны. Тогда полезно выбросить исключение самим.

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

  • raise — оператор
  • Собственный тип исключения

    Иногда удобно создать свой класс исключения, чтобы отличать ваши ошибки от системных.

    Это особенно полезно в больших проектах, но уже на базовом уровне важно знать, что так можно.

    Практический пример: читаем файл, считаем строки, обрабатываем ошибки

    Что здесь тренируется:

  • модуль pathlib
  • функция, которая возвращает значение
  • файловый ввод
  • обработка FileNotFoundError
  • Рекомендации по стилю

  • Ловите конкретные исключения (ValueError, FileNotFoundError), а не «всё подряд».
  • Делайте блок try как можно короче: внутри него должен быть только код, который реально может выбросить ожидаемую ошибку.
  • Для файлов почти всегда используйте with.
  • Что дальше

    Теперь вы умеете:

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