Python: основы программирования

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

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

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

Что такое Python и почему он подходит для старта

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

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

    Как устроено «окружение» Python

    Чтобы писать и запускать код, обычно нужны:

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

    Какую версию Python устанавливать

    Рекомендуется ставить актуальную стабильную версию Python 3. В этом курсе предполагается Python 3.x.

    Важно:

  • Python 2 устарел и не используется в современном обучении
  • для некоторых проектов критична версия (например, 3.10 vs 3.12), но на старте достаточно последней стабильной
  • Официальная страница загрузки Python: Python Downloads.

    Установка Python

    Windows

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

    Если команда python не находится, вероятно:

  • Python не добавился в PATH
  • у вас используется команда py (Python Launcher)
  • Тогда попробуйте:

    macOS

    На macOS Python может быть предустановлен, но важно поставить актуальную версию с официального сайта.

  • Скачайте установщик с Python Downloads.
  • Установите Python.
  • Проверка в Terminal:

    Обратите внимание: на macOS часто используется python3 вместо python.

    Linux

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

    Если нужно установить:

  • используйте менеджер пакетов вашего дистрибутива (например, apt, dnf, pacman)
  • либо установите с официального сайта Python Downloads
  • Выбор редактора кода

    VS Code

    Популярный выбор для обучения:

  • бесплатный
  • много расширений
  • удобная работа с терминалом и проектами
  • Скачать: Visual Studio Code.

    Рекомендуемое расширение:

  • Python extension for Visual Studio Code
  • PyCharm

    IDE, ориентированная на Python (есть бесплатная Community-версия):

  • мощные подсказки
  • удобная работа с проектами и окружениями
  • Скачать: PyCharm.

    Первый запуск Python

    Есть два основных способа:

  • интерактивный режим (REPL): удобно быстро проверить идею
  • запуск файла .py: основной способ писать программы
  • Интерактивный режим

    Запустите в терминале:

    или (часто на macOS/Linux):

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

    Чтобы выйти:

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

  • Создайте папку проекта, например python-basics.
  • Внутри создайте файл main.py.
  • Добавьте код:
  • Запустите из терминала в папке проекта:
  • или:

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

    Виртуальное окружение — это отдельная папка с «локальным Python и библиотеками» для конкретного проекта.

    Зачем это нужно:

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

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

    Если у вас команда python3, то:

    Активация окружения

    Windows (PowerShell):

    Windows (cmd):

    macOS/Linux:

    После активации в терминале обычно появляется префикс с именем окружения, например (.venv).

    Установка библиотек через pip

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

    Домашнее правило на будущее: устанавливайте пакеты внутрь активированного виртуального окружения.

    Официальная документация:

  • venv — Creation of virtual environments
  • pip — Installation
  • Типичная структура учебного проекта

    Пример минимальной структуры:

  • python-basics/
  • main.py
  • .venv/
  • Папку .venv обычно не добавляют в репозиторий, если вы используете систему контроля версий, а зависимости фиксируют отдельно (к этому мы ещё вернёмся позже в курсе).

    Частые проблемы и быстрые решения

  • Команда python не найдена
  • Решение: проверьте установку и PATH (Windows), попробуйте python3 (macOS/Linux) или py (Windows)
  • pip не работает или ставит пакеты не туда
  • Решение: активируйте виртуальное окружение и повторите установку
  • Редактор не видит окружение
  • Решение: в VS Code выберите интерпретатор из .venv, в PyCharm укажите interpreter проекта
  • Что дальше

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

    2. Типы данных, переменные и операции

    Типы данных, переменные и операции

    Зачем нужны типы данных и переменные

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

    Тип данных отвечает на вопрос: что именно хранится (число, текст, логическое значение и т.д.).

    Переменная отвечает на вопрос: где это хранится (как мы назовём значение, чтобы использовать его дальше).

    Переменные в Python

    Переменная создаётся в момент присваивания:

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

  • Имя может состоять из букв, цифр и символа _.
  • Имя не может начинаться с цифры.
  • Регистр важен: age и Age — разные имена.
  • Нельзя использовать ключевые слова Python (например, if, for, class).
  • Практический стиль (наиболее распространённый):

  • Для переменных используйте snake_case, например total_price.
  • Полезная ссылка по стилю кода: PEP 8 — Style Guide for Python Code.

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

    В Python переменную можно переопределять:

    Это нормально: переменная — это имя, которое в текущий момент указывает на некоторое значение.

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

    Ниже — самые важные типы, с которых обычно начинается обучение.

    !Краткая шпаргалка по базовым типам данных

    Числа: int и float

  • int — целые числа: -5, 0, 42.
  • float — числа с дробной частью: 3.14, 0.5, -2.0.
  • Примеры:

    Важно: оператор / в Python всегда делает деление с результатом типа float.

    Строки: str

    Строка — это текст. Её можно записывать в кавычках:

    Частые операции со строками:

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

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

    Индексы начинаются с 0:

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

    bool принимает одно из двух значений:

  • True
  • False
  • Он чаще всего появляется в условиях:

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

    None означает «значение отсутствует».

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

    Как узнать тип значения

    Для проверки типа используйте функцию type():

    Функции type() посвящён раздел в документации: Built-in Functions — type.

    Операции и выражения

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

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

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

  • + сложение
  • - вычитание
  • * умножение
  • / деление
  • // целочисленное деление
  • % остаток от деления
  • ** возведение в степень
  • Пример:

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

    Результат сравнения — всегда bool.

  • == равно
  • != не равно
  • < меньше
  • <= меньше или равно
  • > больше
  • >= больше или равно
  • Пример:

    Логические операторы

  • andи
  • orили
  • notне
  • Пример:

    Приоритет операторов

    Иногда важно понимать, что выполняется раньше. Например, умножение выполняется раньше сложения:

    Таблица приоритетов в официальной документации: Python Reference — Operator precedence.

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

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

    int(), float(), str()

    Важно: преобразование строки в число возможно только если строка выглядит как число. Иначе будет ошибка.

    Ввод и вывод

    print()

    print() выводит данные в консоль:

    input()

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

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

    Частые ошибки начинающих

  • Путать число и строку: "10" и 10 — разные типы.
  • Забывать, что input() возвращает строку.
  • Неправильно использовать = и ==:
  • - = — присваивание - == — сравнение

    Что дальше

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

    Полный список стандартных типов данных описан в документации: Built-in Types.

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

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

    Зачем нужны условия и циклы

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

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

    Условный оператор if

    Базовая форма if

    if проверяет условие (выражение, результат которого True или False). Если условие истинно — выполняется блок кода.

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

  • после условия ставится :
  • код внутри блока обязательно с отступом (обычно 4 пробела)
  • Ветвление if / else

    Если условие ложно, можно выполнить альтернативный блок через else.

    !Блок-схема показывает, как работает ветвление if/else

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

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

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

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

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

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

    Условия: сравнения, логика и типичные ошибки

    Сравнения дают bool

    Операторы сравнения вы уже видели в прошлой теме. Напомним идею: выражение сравнения возвращает True или False.

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

    Их используют, когда нужно объединить несколько проверок.

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

  • and требует истинности всех частей
  • or требует истинности хотя бы одной части
  • not меняет True на False и наоборот
  • Частая ошибка: = вместо ==

  • = используется для присваивания
  • == используется для сравнения
  • Неправильно:

    Правильно:

    input() возвращает строку

    Ещё одна частая ошибка — сравнивать число со строкой. input() возвращает str, поэтому для чисел нужно преобразование.

    Цикл while

    while повторяет блок кода, пока условие истинно.

    Пример: счётчик

    Важно:

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

    Управление циклом: break и continue

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

  • break — немедленно завершает цикл
  • continue — пропускает остаток текущей итерации и переходит к следующей
  • Цикл for

    for используют, когда нужно пройтись по последовательности значений.

    range() — генератор последовательности чисел

    Самый частый способ обучения циклам — range().

    Этот код выведет числа 0, 1, 2, 3, 4.

    Частые формы range():

  • range(stop) — от 0 до stop - 1
  • range(start, stop) — от start до stop - 1
  • range(start, stop, step) — с шагом step
  • Пример со стартом и шагом:

    Перебор строки

    Строка — это последовательность символов, её тоже можно перебирать.

    break и continue в for

    Работают так же, как и в while.

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

    Таблица для ориентира:

    | Ситуация | Что обычно выбрать | Почему | |---|---|---| | Известно, сколько раз повторять | for + range() | проще и меньше риск бесконечного цикла | | Повторяем, пока выполняется условие | while | условие — главный контролирующий фактор | | Нужно ждать события (пока пользователь не введёт нужное) | while | количество повторов заранее неизвестно |

    Частые ошибки начинающих

  • Забыли : после if, elif, else, for, while
  • Смешали отступы (часть строк с пробелами, часть с табами)
  • Получили бесконечный while, потому что не меняется переменная в условии
  • Сравнили input() (строку) с числом, забыв int()
  • Полезные ссылки

  • Документация Python: if
  • Документация Python: while
  • Документация Python: for
  • Документация Python: range
  • Что дальше

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

    4. Функции и области видимости

    Функции и области видимости

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

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

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

    Что такое функция

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

    Как объявить функцию

    Функции объявляют с помощью def.

    Правила такие же, как в if и циклах:

  • после строки с def ... ставится :
  • тело функции записывается с отступом
  • Как вызвать функцию

    Чтобы выполнить код функции, её нужно вызвать по имени:

    Параметры и аргументы

    Функция часто принимает данные на вход.

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

    | Вариант | Как выглядит | Когда удобно | |---|---|---| | Позиционные | f(10, 20) | когда порядок понятен | | Именованные | f(x=10, y=20) | когда важна читаемость | | Со значением по умолчанию | def f(x=10): ... | когда есть типичный случай |

    Пример с именованными аргументами:

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

    Если параметр имеет значение по умолчанию, аргумент можно не передавать:

    Практическое правило: значения по умолчанию должны быть простыми и неизменяемыми (например, числа, строки, None).

    Возврат результата: return

    Функция может не только печатать, но и возвращать значение в то место, откуда её вызвали.

    Важно:

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

    Ранний выход из функции

    return часто используют, чтобы быстро завершить работу при ошибочных входных данных.

    Области видимости: где “живут” переменные

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

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

    Переменные, созданные внутри функции, обычно являются локальными. Они доступны только внутри этой функции.

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

  • локальные переменные помогают не “загрязнять” программу лишними именами
  • одинаковые имена в разных функциях не мешают друг другу
  • Глобальные переменные

    Переменные, созданные снаружи функций (на верхнем уровне файла), часто называют глобальными.

    #### Почему присваивание работает иначе

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

    Ошибка появляется потому, что Python видит присваивание counter = ... и считает counter локальной, но справа вы пытаетесь прочитать её до создания.

    Ключевое слово global

    Если вам действительно нужно изменить глобальную переменную внутри функции, используйте global.

    Практическое правило: старайтесь редко использовать global. Чаще понятнее, когда функция получает данные через параметры и возвращает результат через return.

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

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

    Иногда функция объявляется внутри другой функции. Тогда внутренняя функция может использовать переменные внешней функции.

    Если нужно изменить переменную внешней функции, используют nonlocal.

    На старте достаточно запомнить:

  • внутри функции обычно работают локальные переменные
  • global — чтобы изменять глобальную переменную
  • nonlocal — чтобы изменять переменную внешней (но не глобальной) функции
  • Хороший стиль: функции как “чёрные ящики”

    Чтобы код было легче тестировать и расширять, полезно придерживаться простого подхода:

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

    Полезные ссылки

  • Python Tutorial: Defining Functions
  • Python Tutorial: More on Defining Functions
  • Документация Python: The global statement
  • Документация Python: The nonlocal statement
  • Что дальше

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

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

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

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

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

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

    !Схема-памятка, чем отличаются list/tuple/set/dict

    Общее: длина, перебор, проверка наличия

    Для многих коллекций работают общие идеи.

    Длина: len()

    len() возвращает количество элементов.

    Перебор: for

    Коллекции удобно обрабатывать циклом.

    Проверка наличия: in

    Оператор in возвращает True или False.

    Важно: как именно работает in, зависит от типа коллекции. Для списка поиск обычно медленнее, чем для множества или словаря.

    Списки: list

    Список — упорядоченная изменяемая коллекция.

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

    Доступ по индексу и срезы

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

    Срезы (часть списка): start:stop (правая граница не включается).

    Изменение списка

    Замена элемента:

    Добавление:

    Удаление:

    Очистка:

    Полезные приёмы со списками

    Счётчик в цикле:

    Фильтрация (оставить только нужные элементы):

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

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

    Чтобы сделать поверхностную копию:

    Документация: Built-in Types — list

    Кортежи: tuple

    Кортеж — упорядоченная неизменяемая коллекция.

  • упорядоченная: есть индексы
  • неизменяемая: нельзя сделать t[0] = ..., нельзя append
  • Когда удобны кортежи

  • когда данные должны оставаться фиксированными
  • когда нужно вернуть из функции несколько значений
  • когда используете «запись» из нескольких полей
  • Создание кортежа

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

    Работают так же, как у списка.

    Распаковка (очень полезно)

    И частый паттерн со словарями (позже):

    Документация: Built-in Types — tuple

    Множества: set

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

  • неупорядоченная: нет стабильных индексов (нельзя s[0])
  • уникальная: один и тот же элемент хранится один раз
  • изменяемая: можно добавлять и удалять
  • Создание множества

    Если в фигурных скобках есть повторы, они исчезнут:

    Добавление и удаление

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

    Пересечение (общие элементы):

    Объединение:

    Разность (что есть в a, но нет в b):

    Когда множества особенно полезны

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

    Документация: Built-in Types — set

    Словари: dict

    Словарь — коллекция пар ключ → значение.

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

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

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

    Удаление

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

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

    Ключи и значения:

    Только значения:

    Типичный кейс: подсчёт частоты

    Посчитаем, сколько раз встречается каждое слово.

    Это хорошо связывается с темами if и циклов: словарь хранит состояние, а ветвление выбирает, как его обновлять.

    Документация: Built-in Types — dict

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

    | Задача | Обычно выбирают | Почему | |---|---|---| | Нужен порядок и можно менять элементы | list | индексы, срезы, удобно накапливать через append() | | Нужен порядок, но данные фиксированы | tuple | защищает от случайных изменений | | Нужны только уникальные значения | set | автоматически убирает повторы, быстро проверяет наличие | | Нужен доступ по «имени» (ключу) | dict | быстрый поиск значения по ключу |

    Частые ошибки начинающих

  • Пытаться обратиться к элементу множества по индексу: s[0] не работает.
  • Забывать, что {} — это пустой словарь, а пустое множество создаётся как set().
  • Получать KeyError из-за d[key], когда ключ отсутствует, вместо d.get(key).
  • Считать, что b = a создаёт копию списка: это просто второе имя.
  • Полезные ссылки

  • Встроенные типы данных Python (Built-in Types)
  • Типы данных последовательностей (Sequence Types)
  • Типы данных отображения (Mapping Types — dict)
  • Типы данных множеств (Set Types)
  • Что дальше

    Коллекции — основа большинства программ. Дальше мы будем чаще комбинировать всё, что уже изучили:

  • функции, которые принимают и возвращают коллекции
  • циклы и условия для обработки данных
  • более структурный подход к коду, где коллекции хранят состояние программы
  • 6. Работа со строками и файлами

    Работа со строками и файлами

    Как эта тема связана с предыдущими

    Ранее вы уже использовали print() и input(), писали условия и циклы, выносили логику в функции и хранили данные в коллекциях. В реальных программах очень часто нужно:

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

    Строки в Python: что важно помнить

    str в Python хранит текст и является неизменяемым типом. Это означает, что методы строк не меняют строку “на месте”, а возвращают новую строку.

    Документация: Built-in Types — str

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

    Строка ведёт себя как последовательность символов.

    Полезно вместе с циклами:

    Частые операции со строками

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

    Проверки и поиск

  • in проверяет, встречается ли подстрока
  • startswith() и endswith() проверяют начало и конец
  • find() возвращает индекс или -1
  • Замена

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

    Удаление пробелов по краям: strip()

    Очень полезно при обработке пользовательского ввода и строк из файлов.

    Есть варианты:

  • lstrip() убирает слева
  • rstrip() убирает справа
  • Разделение и склейка: split() и join()

    split() превращает строку в список подстрок.

    join() делает обратное: склеивает элементы списка в строку.

    Связка с коллекциями и циклами выглядит так:

    Изменение регистра

    Форматирование строк

    f-строки

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

    Можно вставлять выражения:

    Документация: Formatted string literals (f-strings)

    format()

    Иногда встречается в чужом коде:

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

    Кодировки: почему иногда “кракозябры”

    Файл хранит не “буквы”, а байты. Кодировка описывает, как байты превращаются в символы. На практике почти всегда нужно использовать utf-8.

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

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

    Работа с файлами

    Основная идея

    Файл открывают, читают или записывают, затем закрывают.

    !Схема жизненного цикла работы с файлом

    Почему лучше использовать with

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

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

    Режимы открытия файла

    | Режим | Назначение | Особенность | |---|---|---| | "r" | чтение | ошибка, если файла нет | | "w" | запись | перезаписывает файл | | "a" | добавление в конец | создаёт файл, если его нет | | "r+" | чтение и запись | файл должен существовать |

    Чаще всего вы будете использовать "r", "w", "a".

    Чтение файла целиком: read()

    Подходит для небольших файлов.

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

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

    Здесь соединяются темы:

  • цикл for
  • строковые методы strip()
  • условия if
  • Запись в файл: write()

    write() записывает строку. Перевод строки нужно добавлять вручную через "\n".

    Добавление в конец файла: режим "a"

    Практический мини-кейс: посчитать слова из файла

    Задача: прочитать файл, разбить текст на слова и посчитать частоту слов в словаре.

    Что здесь используется из прошлых тем:

  • функции: normalize_word
  • циклы: два вложенных for
  • условия: обработка пустых слов
  • словарь: хранение счётчиков
  • Частые ошибки начинающих

  • Забыли указать encoding="utf-8" и получили проблемы с русским текстом.
  • Используют "w", когда нужно было "a", и случайно перезаписывают файл.
  • Не делают strip() и получают строки с "\n" в конце.
  • Ожидают, что replace() изменит строку “на месте”, а не вернёт новую.
  • Что дальше

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

    7. Основы модулей и небольшой итоговый проект

    Основы модулей и небольшой итоговый проект

    Как эта тема связана с предыдущими

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

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

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

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

    Пример:

  • main.py — точка входа (то, что запускаем)
  • utils.py — вспомогательные функции
  • Когда вы пишете import utils, Python читает и выполняет файл utils.py, после чего вы можете обращаться к его функциям и переменным.

    Официальная документация:

  • The import system
  • Modules
  • Способы импорта

    import module

    Импортируем модуль целиком и обращаемся через точку.

    Плюсы:

  • понятно, откуда взялась функция (math.sqrt)
  • меньше риск конфликта имён
  • from module import name

    Импортируем конкретные объекты прямо в текущий файл.

    Риск: можно случайно затереть имя локальной переменной или функции.

    Псевдонимы: as

    Иногда модулю дают короткое имя.

    Импорт всего через *

    Так делать на практике не рекомендуют, потому что становится неясно, какие имена появились в коде.

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

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

    Полезные примеры для базового уровня:

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

  • The Python Standard Library
  • Пример: случайное число и случайный выбор из списка.

    Свои модули: как разбить проект на файлы

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

    !Пример того, как разложить небольшой проект по файлам

    Допустим, у вас такая структура:

  • project/
  • main.py
  • text_utils.py
  • file_utils.py
  • data/input.txt
  • Правило импорта в одном каталоге

    Если файлы лежат рядом, импорт простой:

    А в text_utils.py лежит функция:

    Почему важно имя файла

    Имя файла становится именем модуля:

  • файл text_utils.py
  • импорт import text_utils
  • Практическое правило: называйте модули так, чтобы не конфликтовать со стандартной библиотекой. Например, не стоит называть свой файл random.py или json.py.

    __name__ == "__main__": как не запускать код при импорте

    Когда Python запускает файл, у него есть специальная переменная __name__.

  • если файл запущен напрямую, __name__ == "__main__"
  • если файл импортирован, __name__ будет равен имени модуля
  • Это позволяет писать в модуле тестовый запуск, который не сработает при импорте.

    Небольшой итоговый проект

    Сделаем мини-программу "Анализатор текста":

  • читает текстовый файл
  • нормализует слова (нижний регистр, обрезка пробелов, удаление некоторых знаков)
  • считает частоты слов
  • сохраняет отчёт в файл
  • Это повторяет все ключевые темы курса:

  • функции
  • условия и циклы
  • коллекции (словарь для подсчёта)
  • строки (split, strip, lower, replace)
  • файлы (with open(...))
  • модули (разнесём код по файлам)
  • Шаг 1. Подготовка данных

    Создайте файл data/input.txt и вставьте 2–3 абзаца любого текста.

    Шаг 2. Модуль text_utils.py

    Здесь будет нормализация и разбиение на слова.

    Шаг 3. Модуль file_utils.py

    Здесь — чтение строк и запись отчёта.

    Обратите внимание:

  • read_lines использует yield, чтобы отдавать строки по одной (так удобно и для больших файлов)
  • write_report ожидает список строк отчёта
  • Шаг 4. Главный файл main.py

    Точка входа: собираем всё вместе.

    Что улучшить дальше (по желанию)

  • добавить ввод путей через input()
  • фильтровать слишком короткие слова (например, длиной меньше 2)
  • сохранять отчёт в формате JSON (через модуль json)
  • сделать сортировку не только по частоте, но и по алфавиту при равенстве
  • Частые ошибки при работе с модулями

  • Назвали свой файл так же, как модуль стандартной библиотеки (json.py, random.py) и получили странные ошибки импорта.
  • Написали код на верхнем уровне модуля (вне функций) и он выполняется при import.
  • Пытаетесь импортировать модуль, но запускаете файл не из той папки (из-за этого Python “не видит” соседние файлы).
  • Итог

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

  • подключать модули через import
  • пользоваться стандартной библиотекой
  • создавать свои модули и разбивать проект по файлам
  • использовать if __name__ == "__main__":, чтобы отделять импортируемую часть от запускаемой
  • И вы собрали небольшой проект, который использует все основные темы курса и показывает, как выглядит “настоящая” структура кода даже на базовом уровне.