Python с нуля: основы программирования и практика

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

1. Установка Python и настройка среды разработки

Установка Python и настройка среды разработки

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

---

1) Что нужно установить: Python и (опционально) IDE

  • Python — сам интерпретатор (программа, которая выполняет ваш код).
  • pip — менеджер пакетов Python (обычно устанавливается вместе с Python).
  • IDE/редактор — инструмент для написания кода.
  • Подходы:

  • Для старта достаточно IDLE (идёт вместе с Python) или любого редактора.
  • Для комфортной разработки чаще выбирают PyCharm или VS Code.
  • ---

    2) Установка Python

    Важные правила перед установкой

  • Устанавливайте Python 3 (актуальная ветка языка).
  • На Windows почти всегда стоит включать опцию добавления Python в PATH.
  • Лучше иметь одну понятную установку Python, чем несколько случайных.
  • ---

    3) Windows: установка и проверка

    Установка

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

    Откройте PowerShell или Командную строку и выполните:

    Ожидаемый результат: строка вида Python 3.x.x.

    Проверьте pip:

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

    py — это Python Launcher, который часто ставится вместе с Python и помогает выбирать версию.

    Типичная проблема: «python не является внутренней или внешней командой»

    Причины:

  • не добавили Python в PATH при установке;
  • установлен Python, но терминал был открыт до установки;
  • установлено несколько версий, конфликт путей.
  • Решение (быстрый путь):

  • переустановите Python и включите Add to PATH.
  • ---

    4) macOS: установка и проверка

    На macOS может быть предустановлен Python, но часто это не тот вариант, который нужен для обучения.

    Рекомендуемый способ

  • Установите Python 3 с официального сайта.
  • Откройте Terminal и проверьте:
  • > На macOS команды часто идут как python3 и pip3, чтобы не путать с системным python.

    ---

    5) Linux: установка и проверка

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

    Проверка:

    Если pip отсутствует:

    Установка Python и pip обычно делается через менеджер пакетов вашего дистрибутива (apt/dnf/pacman). Конкретные команды зависят от системы.

    ---

    6) Где вы запускаете Python: REPL, файлы и терминал

    Есть три частых способа:

  • REPL (интерактивный режим) — быстро проверить идею.
  • - Запуск: python или python3 в терминале.
  • Запуск файла .py — основной способ работы.
  • - Пример: python main.py (или python3 main.py).
  • Запуск из IDE — нажатием кнопки Run, но внутри всё равно происходит запуск интерпретатора.
  • Небольшая памятка:

    ---

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

    Виртуальное окружение (venv) — это изолированная папка с «своим» Python-пакетами для конкретного проекта.

    Зачем:

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

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

    Если на macOS/Linux:

    Активация

    Windows (PowerShell):

    Windows (cmd):

    macOS/Linux:

    После активации в начале строки терминала обычно появляется имя окружения (например, (.venv)), а команды python/pip начинают ссылаться на окружение.

    Установка пакетов в окружение

    Проверить список установленных пакетов:

    <details> <summary>

    Если окружение не активируется (частые причины)

    </summary>

  • PowerShell запрещает запуск скриптов: может потребоваться изменить политику выполнения (Execution Policy) в Windows. Это системная настройка, и в корпоративной среде она часто ограничена.
  • Вы запускаете активацию не из папки проекта: проверьте, что .venv действительно существует рядом.
  • Путаете python и python3: на macOS/Linux чаще нужен python3.
  • </details>

    ---

    8) Выбор и настройка редактора/IDE

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

    Вариант A: IDLE (самый простой)

    Плюсы:

  • устанавливается вместе с Python;
  • не требует настроек.
  • Минусы:

  • мало возможностей для проектов и больших программ.
  • Вариант B: VS Code

    Рекомендуемая минимальная настройка:

  • Установите VS Code.
  • Установите расширение Python.
  • Откройте папку проекта.
  • Выберите интерпретатор (команда вида “Python: Select Interpreter”):
  • - если используете venv, выбирайте Python из .venv.

    Что важно:

  • терминал внутри VS Code должен быть открыт после активации окружения или настроен на нужный интерпретатор.
  • Вариант C: PyCharm

    Хорош тем, что многие вещи делает сам:

  • создаёт проект;
  • предлагает создать/подключить виртуальное окружение;
  • удобный запуск и отладка.
  • Ключевой момент: при создании проекта выберите Virtualenv (venv) и убедитесь, что проект использует его, а не системный Python.

    ---

    9) Структура папки проекта (рекомендация для старта)

    Держите файлы аккуратно — так проще учиться и меньше путаницы.

    Пример:

    ---

    10) Финальная самопроверка: всё ли готово

    Сделайте три проверки:

  • Версия Python:
  • (или python3 --version)

  • Версия pip:
  • Понимание, какой Python используется:
  • Команда выводит путь к интерпретатору. Если вы активировали .venv, путь должен вести внутрь папки проекта (в .venv).

    ---

    Итог

    У вас должен быть установлен Python 3, работать pip, создано виртуальное окружение для проекта и настроена среда разработки так, чтобы она использовала именно этот интерпретатор. Это базовая опора, чтобы дальше писать код без постоянной борьбы с настройками.

    2. Переменные, типы данных и простые операции

    Переменные, типы данных и простые операции

    Переменные и типы данных — это «строительные блоки» любой программы. В Python вы описываете данные (числа, текст, признаки «да/нет») и выполняете над ними операции.

    ---

    1) Переменные: что это и как работают

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

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

    Важно: Python — язык с динамической типизацией. Это означает, что тип хранится у значения, а не «навсегда закреплён» за переменной.

    Имена переменных (правила и стиль)

    Правила:

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

  • snake_case для переменных и функций: total_price, user_name
  • имена должны быть «говорящими»: count, sum_scores, а не a, b (кроме коротких примеров)
  • ---

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

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

    | Тип | Пример | Для чего | Особенности | |---|---|---|---| | int | 42, -7 | целые числа | без дробной части | | float | 3.14, -0.5 | числа с дробью | возможны погрешности вычислений | | bool | True, False | логика, условия | результат сравнений | | str | "Привет" | текст | поддерживает операции над строками | | NoneType (None) | None | «нет значения» | часто как заглушка |

    Проверить тип можно так:

    Числа: int и float

  • int подходит для счётчиков, количества, индексов.
  • float — для измерений, процентов, средних значений.
  • Осторожно с float: некоторые числа нельзя представить точно.

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

    bool обычно появляется из сравнений:

    Строки: str

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

    Строки в Python неизменяемые: нельзя «поменять один символ внутри» напрямую.

    None

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

    Это не то же самое, что 0, пустая строка "" или False — это отдельное значение.

    ---

    3) Простые операции

    Арифметика

    | Оператор | Значение | Пример | Результат | |---|---|---|---| | + | сложение | 2 + 3 | 5 | | - | вычитание | 10 - 4 | 6 | | | умножение | 3 4 | 12 | | / | деление (всегда float) | 5 / 2 | 2.5 | | // | целочисленное деление | 5 // 2 | 2 | | % | остаток от деления | 5 % 2 | 1 | | | степень | 2 3 | 8 |

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

    Сравнения

    Сравнения возвращают bool.

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

    Пример:

    Логические операции

    | Оператор | Смысл | |---|---| | and | оба условия истинны | | or | истинно хотя бы одно | | not | логическое «не» |

    ---

    4) Операции со строками

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

    Форматирование строк (f-строки)

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

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

    ---

    5) Преобразование типов (частая практика)

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

    Частая ошибка: пытаться сложить строку и число.

    ---

    6) Быстрый ввод/вывод и переменные

    print() выводит данные, а input() читает строку из консоли.

    Заметьте: input() всегда возвращает строку, поэтому для чисел часто нужен int() или float().

    ---

    7) Мини-практика (самопроверка)

  • Создайте переменные a = 7, b = 3 и выведите:
  • - сумму, разность, произведение - результат /, //, %
  • Дана строка " Hello, Python! ":
  • - уберите пробелы по краям - сделайте все буквы маленькими
  • Спросите у пользователя число и выведите его квадрат (используйте **).
  • <details> <summary>

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

    </summary>

  • Путаница = и ==: = присваивает, == сравнивает.
  • Сложение строки и числа: приводите типы явно (str(), int()).
  • Неверные имена переменных: 2name нельзя, а name2 можно.
  • Ожидание “точной математики” от float: для денег и точных расчётов часто используют округление или другие подходы.
  • </details>

    3. Условия, циклы и базовая логика программы

    Условия, циклы и базовая логика программы

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

    ---

    1) Как программа «думает»: ветвления и повторения

    Почти любую бытовую логику можно свести к двум конструкциям:

  • Ветвление: если условие истинно — делай одно, иначе — другое.
  • Повторение: пока условие истинно — повторяй действия, или повтори действия для каждого элемента.
  • В Python за это отвечают if/elif/else, while, for.

    ---

    2) Условный оператор if: выбор ветки

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

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

  • Двоеточие : завершает заголовок условия.
  • Отступы определяют блок кода (обычно 4 пробела). Это важно: отступы — часть синтаксиса.
  • Несколько вариантов: elif

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

    Частый шаблон: ранний выход (guard clause)

    Вместо глубоких вложенностей удобно делать «быстрые проверки».

    ---

    3) Что считается «истиной»: truthy/falsy

    В if можно подставлять не только True/False, но и другие значения. Python сам трактует их как «истина/ложь».

    Обычно ложными считаются:

  • 0, 0.0
  • пустая строка ""
  • пустые коллекции (например, [], {})
  • None
  • Пример:

    <details> <summary>

    Мини-таблица truthy/falsy (частые случаи)

    </summary>

    | Значение | В if считается | Почему полезно | |---|---|---| | "hello" | истина | строка не пустая | | "" | ложь | пустой ввод | | 5 | истина | число не ноль | | 0 | ложь | «ничего»/«нет» | | None | ложь | «значение отсутствует» |

    </details>

    ---

    4) Логика условий: объединяем проверки

    Для комбинирования условий используются and, or, not (логические операции упоминались ранее — здесь важно их практическое применение).

    Полезный приём: выносить сложные проверки в «говорящие» переменные.

    Так код легче читать и отлаживать.

    ---

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

    while удобен, когда неизвестно заранее, сколько раз нужно повторить действия.

    Пример: ввод до корректного значения

    Риск while: бесконечный цикл

    Если условие всегда истинно (или вы забыли менять данные), цикл не завершится.

    Чтобы цикл завершался, в теле обычно есть «шаг», который приближает к выходу.

    ---

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

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

  • фиксированное число раз, или
  • для каждого элемента некоторой последовательности.
  • Повторить N раз: range()

    range(5) даёт числа 0, 1, 2, 3, 4.

    Часто нужно начать не с нуля:

    Пройти по строке (как по символам)

    ---

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

    break: выйти из цикла досрочно

    continue: пропустить текущую итерацию

    ---

    8) Вложенность: условия внутри циклов и циклы внутри условий

    Это основа «настоящей» логики.

    Пример: найти первое число, делящееся на 7.

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

    ---

    9) Мини-практика (самопроверка)

    1) Проверка пароля: спросите пароль. Если он пустой — сообщите об ошибке, иначе — «принято».

    2) Сумма чисел: посчитайте сумму чисел от 1 до 100 с помощью for и range().

    3) Угадай число (упрощённо): - заведите число secret = 7 - в цикле while спрашивайте ввод - если угадали — напечатайте «угадал» и выйдите через break

    <details> <summary>

    Частые ошибки новичков в условиях и циклах

    </summary>

    1) Неправильные отступы - В Python отступ определяет, какие строки входят в блок if/while/for.

    2) Слишком сложное условие в одну строку - Лучше разбить на понятные части: - is_valid = ... - if is_valid: ...

    3) Бесконечный while без выхода - Всегда проверяйте: что должно измениться, чтобы условие стало ложным?

    4) Ожидание, что for сам «поменяет» ваш счётчик - В for i in range(...) переменную i менять вручную обычно не нужно.

    </details>

    ---

    Итог

  • if/elif/else управляет ветвлением.
  • while повторяет действия, пока условие истинно (важно не забыть про выход).
  • for удобен для фиксированного числа повторов и прохода по последовательностям.
  • break/continue дают точный контроль над поведением циклов.
  • С этими конструкциями вы уже можете писать программы, которые реагируют на ввод, проверяют условия и выполняют повторяющиеся действия.

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

    Строки, списки, кортежи, множества и словари

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

    ---

    1) Строки (str): последовательность символов

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

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

  • Индексы начинаются с 0.
  • Отрицательные индексы идут с конца.
  • Срез s[a:b] берёт символы с позиции a до b, не включая b.
  • Неизменяемость строк

    Строки нельзя менять “на месте”:

    Частые полезные методы

    ---

    2) Списки (list): изменяемая упорядоченная коллекция

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

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

    Списки могут хранить разные типы (хотя в реальных задачах часто держат один тип):

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

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

    > sort() меняет сам список. Если нужно получить новый отсортированный список, используйте sorted(nums).

    <details> <summary>

    Частая ловушка: копирование списков

    </summary>

    Списки изменяемы, и простое присваивание копию не делает:

    Правильно делать копию:

    Для вложенных списков (список внутри списка) может потребоваться «глубокая» копия — это отдельная тема.

    </details>

    ---

    3) Кортежи (tuple): неизменяемая упорядоченная коллекция

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

    Создание

    Доступ и распаковка

    Кортежи часто используют как «набор полей»:

    ---

    4) Множества (set): уникальные элементы без порядка

    set хранит только уникальные значения. Порядок элементов не гарантируется.

    Создание и базовые операции

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

    Операции множеств: объединение/пересечение/разность

    Практический смысл:

  • быстро убрать дубликаты;
  • сравнивать наборы значений;
  • находить общие элементы.
  • ---

    5) Словари (dict): ключ → значение

    Словарь хранит пары «ключ: значение». Доступ идёт по ключу, а не по индексу.

    Создание и чтение

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

    Добавление и изменение

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

    Если ключа нет, обращение user["phone"] вызовет KeyError. Часто удобнее:

    Удаление

    Итерация по словарю

    ---

    6) Как выбрать нужный тип (короткая шпаргалка)

    | Тип | Когда выбирать | Главная особенность | |---|---|---| | str | текст, символы, ввод/вывод | неизменяемая последовательность | | list | изменяемый набор элементов в порядке | можно добавлять/удалять/менять | | tuple | фиксированный набор значений | неизменяемость, удобно «упаковывать» данные | | set | уникальные элементы, быстрые проверки принадлежности | без порядка, без дубликатов | | dict | доступ по ключу, хранение свойств/настроек | ключ → значение |

    ---

    7) Мини-практика (самопроверка)

    1) Строки: дана строка " one, two, three ". Уберите пробелы по краям, разбейте по запятой и выведите список слов.

    2) Списки: дан список чисел. Добавьте число в конец, удалите первый элемент, отсортируйте список.

    3) Множества: дан список с повторами. Превратите его в множество и посчитайте, сколько уникальных элементов.

    4) Словари: создайте словарь product с ключами name, price. Безопасно получите discount через get, чтобы при отсутствии ключа было 0.

    <details> <summary>

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

    </summary>

    1) Путать {}: это пустой dict, а не set. Пустое множество — set().

    2) Ожидать порядок в set: множества не предназначены для хранения «по порядку».

    3) Ловить KeyError в словаре: чаще используйте get() или предварительно проверяйте if key in d:.

    4) Не понимать, где объект меняется “на месте”: - list.sort() меняет список, - sorted(list) возвращает новый, - строки всегда создают новые значения при “изменениях”.

    </details>

    5. Функции: параметры, возврат значений, область видимости

    Функции: параметры, возврат значений, область видимости

    Функция — это именованный «кусок программы», который можно вызывать много раз. Она помогает:

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

    1) Базовый синтаксис: def, вызов, тело функции

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

  • def создаёт функцию.
  • Имя функции обычно пишут в snake_case (стиль уже обсуждали ранее).
  • Тело функции — это блок с отступом (как в if/for/while).
  • Вызов — это greet("Анна").
  • ---

    2) Параметры и аргументы: что есть что

  • Параметр — имя в определении функции: def greet(name).
  • Аргумент — конкретное значение при вызове: greet("Анна").
  • Позиционные аргументы

    Аргументы сопоставляются параметрам по порядку:

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

    Можно явно указать, какому параметру что передаём:

    Плюсы: читаемее и меньше ошибок с порядком.

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

    Параметр может иметь дефолт:

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

    *args: переменное число позиционных аргументов

    Если вы хотите принять «сколько угодно» значений:

    Здесь numbers — кортеж (про кортежи уже было в статье про коллекции).

    **kwargs: переменное число именованных аргументов

    Если нужно принять набор «ключ=значение»:

    data будет словарём.

    ---

    3) Возврат значения: return и None

    return возвращает результат

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

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

    Как только сработал return, функция заканчивается:

    Если return нет

    Тогда функция возвращает None:

    Возврат нескольких значений

    В Python можно «вернуть несколько значений» — технически возвращается кортеж:

    ---

    4) Область видимости (scope): где живут переменные

    Переменные внутри функции обычно локальные: они существуют только во время выполнения функции.

    Снаружи функции — глобальная область (уровень модуля/файла):

    Важное правило: чтение vs присваивание

    Если внутри функции вы присваиваете имя, Python считает его локальным.

    global: явное изменение глобальной переменной

    Иногда нужно изменить глобальную переменную (в учебных примерах встречается, в реальных проектах чаще избегают):

    nonlocal: переменная внешней (но не глобальной) функции

    Полезно во вложенных функциях:

    nonlocal означает: «возьми переменную из ближайшей внешней функции».

    ---

    5) Изменяемые объекты и «побочные эффекты»

    Аргументы в Python передаются как ссылки на объекты. Практически это важно для изменяемых типов (например, list, dict).

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

    ---

    6) Мини-практика (самопроверка)

  • Напишите функцию clamp(x, low, high), которая возвращает:
  • - low, если x < low - high, если x > high - иначе x

  • Напишите функцию format_name(first, last, middle=""), которая собирает ФИО в строку. Если middle пустой — не добавляйте лишние пробелы.
  • Дан список чисел. Напишите функцию stats(nums), возвращающую кортеж: (sum_value, avg_value).
  • Объясните (словами), чем отличается функция, которая выводит результат через print, от функции, которая возвращает результат через return.
  • ---

    <details> <summary>

    Частые ошибки новичков в функциях

    </summary>

    1) Путать print и return

  • print нужен для вывода.
  • return нужен для результата, который будет использовать код.
  • 2) Изменять список/словарь и не замечать этого

  • Если функция делает append, pop, dict[...] = ..., то она меняет объект снаружи.
  • 3) Использовать global, когда не нужно

  • Обычно лучше передавать данные параметрами и возвращать результат.
  • 4) Ставить изменяемые значения по умолчанию

  • Плохо: def f(a, items=[]): ... (один и тот же список будет общим между вызовами)
  • Лучше: def f(a, items=None): ... и внутри создать список при необходимости.
  • </details>

    6. Модули и пакеты: импорт и использование библиотек

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

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

    ---

    1) Что такое модуль и пакет

  • Модуль — это один файл *.py.
  • - Пример: utils.py — модуль utils.
  • Пакет — это папка с модулями (и/или подпакетами), которую Python воспринимает как единое пространство имён.
  • - Обычно это папка с файлом __init__.py (в современных Python он не всегда обязателен, но для обучения и совместимости лучше иметь).

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

    ---

    2) Базовый импорт: import module

    Самый простой вариант — импортировать модуль целиком:

    Плюсы:

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

    3) Импорт конкретных объектов: from module import name

    Можно импортировать только то, что нужно:

    Важно: имена sqrt, pi появляются прямо в вашем пространстве имён, поэтому:

  • легче «случайно» затереть имя переменной;
  • иногда хуже читаемость (не видно модуль-источник).
  • ---

    4) Псевдонимы (alias): as

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

    Или при точечном импорте:

    ---

    5) Где Python ищет модули: идея sys.path

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

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

    Если вы случайно назовёте свой файл json.py, то import json может импортировать ваш файл вместо стандартного модуля — это частая ошибка.

    ---

    6) Как запускать модуль «как программу»: __name__ == "__main__"

    Файл-модуль можно:

  • импортировать (использовать как библиотеку),
  • запускать напрямую (как скрипт).
  • Условие ниже помогает отделить «тестовый запуск» от кода, который должен выполняться при импорте:

    Идея:

  • при прямом запуске файла __name__ равно "__main__";
  • при импорте — __name__ равно имени модуля.
  • ---

    7) Свои модули: как правильно подключать

    Пусть у вас есть utils.py и main.py в одной папке.

    utils.py:

    main.py:

    Правило практики: старайтесь, чтобы в файлах-модулях не было «выполнения» при импорте (всё лишнее — под if __name__ == "__main__":).

    ---

    8) Пакеты и импорт из пакета

    Структура:

    mypkg/strings.py:

    main.py:

    Для чего нужен __init__.py

    mypkg/__init__.py может быть пустым, а может:

  • хранить общую инициализацию,
  • «экспортировать» удобные имена:
  • Тогда можно писать:

    ---

    9) Относительные импорты внутри пакета

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

    Точки означают:

  • . — текущий пакет,
  • .. — пакет уровнем выше.
  • Относительные импорты особенно полезны, когда пакет можно переносить и он не должен зависеть от того, где лежит проект.

    ---

    10) Стандартная библиотека: что полезно знать новичку

    В Python много готовых модулей «из коробки». Несколько практичных примеров:

  • math — математика (sqrt, pi, тригонометрия).
  • random — случайные значения (аккуратно в задачах, где важна воспроизводимость).
  • datetime — даты и время.
  • pathlib — работа с путями и файлами (часто удобнее строк).
  • json — чтение/запись JSON.
  • Мини-пример JSON:

    ---

    11) Сторонние библиотеки и pip (важное правило)

    Сторонние библиотеки (не из стандартной библиотеки) обычно ставят через pip в виртуальное окружение. Как создавать и активировать окружение — см. статью про установку и настройку среды разработки.

    После установки библиотеку подключают обычным import.

    ---

    12) Частые ошибки и как их быстро диагностировать

    1) ModuleNotFoundError

  • библиотека не установлена в текущем окружении;
  • вы запускаете код не тем интерпретатором (например, не из активированного .venv).
  • 2) Конфликт имён

  • файл проекта называется как модуль стандартной библиотеки: random.py, json.py, math.py.
  • 3) Циклические импорты

  • a.py импортирует b.py, а b.py импортирует a.py.
  • лечится реорганизацией кода (вынести общее в третий модуль) или переносом импорта внутрь функции (как временная мера).
  • <details> <summary>

    Мини-инструменты для изучения импортированного

    </summary>

  • dir(module) — посмотреть, какие имена есть в модуле.
  • help(module) или help(func) — встроенная справка.
  • Пример:

    </details>

    ---

    Мини-практика (самопроверка)

    1) Создайте модуль text_utils.py с функцией normalize(s) (убрать пробелы по краям и привести к нижнему регистру). Импортируйте её в main.py и проверьте на строке.

    2) Сделайте пакет mypkg с двумя модулями: strings.py и numbers.py. В numbers.py импортируйте что-то из strings.py через относительный импорт.

    3) Проверьте, откуда импортируется модуль json, выведя json.__file__. Затем переименуйте свой файл (если вдруг он назывался json.py) и убедитесь, что импорт стал корректным.

    ---

    Итог

  • import подключает модуль, from ... import ... — конкретные объекты.
  • Пакет — это папка с модулями; __init__.py помогает управлять интерфейсом пакета.
  • Ошибки импорта чаще всего связаны с окружением, путями поиска или конфликтом имён.
  • Стандартная библиотека уже даёт много инструментов, а сторонние библиотеки подключаются тем же механизмом после установки.
  • 7. Работа с файлами и форматами данных (txt, json)

    Работа с файлами и форматами данных (txt, json)

    Файлы — это способ сохранять данные между запусками программы и обмениваться ими с другими программами. В этой статье — практические основы работы с текстовыми файлами (.txt) и форматом данных JSON (.json).

    > Про модули (import json, pathlib) и окружение см. статью «Модули и пакеты: импорт и использование библиотек».

    ---

    1) Важные понятия: путь, кодировка, режим

    Путь к файлу

  • Относительный путь: считается от папки, из которой запускается программа (или от «корня проекта» в IDE).
  • Абсолютный путь: полный путь в системе.
  • Практический совет: храните файлы данных рядом с проектом, а пути собирайте аккуратно (часто удобно через pathlib.Path).

    Кодировка

    Для русского текста почти всегда используйте encoding="utf-8". Без явной кодировки на Windows можно получить «кракозябры».

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

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

    Для текстовых файлов обычно достаточно режимов r/w/a.

    ---

    2) Текстовые файлы (.txt): чтение

    Контекстный менеджер with

    Правильная привычка — открывать файл так, чтобы он гарантированно закрылся:

  • open(...) открывает файл и возвращает объект файла.
  • as f — имя, через которое вы работаете с файлом.
  • f.read() читает содержимое целиком в одну строку.
  • Чтение построчно

    Если файл большой или удобно работать по строкам:

    Замечание: line обычно содержит символ перевода строки \n в конце. Частый приём — убрать его:

    readline() и readlines()

  • readline() — одна строка за раз.
  • readlines() — список строк (может быть тяжёлым для больших файлов).
  • ---

    3) Текстовые файлы (.txt): запись

    Перезапись файла

    Важно: write() не добавляет перевод строки автоматически.

    Добавление в конец (логирование)

    print(..., file=f)

    Иногда удобно печатать прямо в файл:

    ---

    4) Частые ошибки при работе с txt

    1) Неверный путьFileNotFoundError

  • Проверьте, где реально запускается программа.
  • Выведите текущую папку или используйте абсолютный путь.
  • 2) Проблемы с кодировкой → «иероглифы» или UnicodeDecodeError

  • Явно указывайте encoding="utf-8".
  • 3) Случайно перезаписали файл

  • Режим "w" очищает файл.
  • Если нужно дописывать — используйте "a".
  • 4) Забыли про \n в конце строк

  • При чтении строка может содержать \n; при сравнении строк это мешает.
  • <details> <summary>

    Как быстро понять, что именно вы прочитали

    </summary>

    Печатайте «технически», чтобы увидеть скрытые символы:

    </details>

    ---

    5) JSON: зачем он нужен

    JSON — текстовый формат для хранения структурированных данных:

  • объекты (пары ключ–значение) → как dict
  • массивы → как list
  • строки, числа, true/false/null → как str, int/float, bool, None
  • JSON удобен, когда нужно сохранять настройки, результаты, списки объектов.

    Пример JSON-файла:

    ---

    6) JSON в Python: loads/dumps и load/dump

    Подключаем модуль:

    Работа со строкой JSON

  • json.loads(text) превращает JSON-строку в Python-объект.
  • json.dumps(obj) превращает Python-объект в JSON-строку.
  • ensure_ascii=False полезен, чтобы русские буквы записывались читаемо.

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

  • json.load(file_obj) читает JSON из открытого файла.
  • json.dump(obj, file_obj) пишет JSON в открытый файл.
  • Параметр indent=2 делает файл «красиво отформатированным».

    ---

    7) Ограничения JSON (что важно знать)

    1) Ключи в объекте JSON — строки

  • В Python словарь может иметь разные типы ключей, но в JSON — только строки.
  • 2) Не все типы Python сериализуются напрямую

  • Например, set, tuple, datetime — потребуют преобразования (часто в list или str).
  • 3) Nonenull

  • При записи None станет null, при чтении null станет None.
  • ---

    8) Мини‑практика (самопроверка)

    1) TXT — очистка строк

  • Прочитайте файл data.txt, в котором по одной строке записаны слова.
  • Уберите пробелы по краям (strip) и выведите только непустые строки.
  • 2) TXT — простой лог

  • Напишите программу, которая в режиме "a" дописывает в log.txt строку "START" при каждом запуске.
  • 3) JSON — настройки

  • Создайте словарь settings (например, тема, язык, громкость).
  • Сохраните его в settings.json через json.dump.
  • Прочитайте обратно через json.load и выведите одно значение.
  • 4) JSON — список объектов

  • Сохраните список словарей users = [{"name": "..."}, ...] в JSON и прочитайте обратно.
  • ---

    Итог

  • Для текстовых файлов используйте with open(..., encoding="utf-8") и подходящий режим r/w/a.
  • Для структурированных данных удобнее JSON: json.dump/load для файлов и json.dumps/loads для строк.
  • Большинство проблем на практике — это путь к файлу, кодировка и случайная перезапись при режиме "w".
  • 8. Исключения и отладка: поиск и исправление ошибок

    Исключения и отладка: поиск и исправление ошибок

    Ошибки в программах — это нормально. Важно не «бояться красного текста», а уметь:

  • Понять, что именно пошло не так (по сообщению и трассировке).
  • Локализовать место (строка, функция, входные данные).
  • Исправить причину, а не «приглушить симптом».
  • В Python для управляемой реакции на ошибки используются исключения (exceptions), а для поиска причин — отладка.

    ---

    1) Два класса проблем: синтаксис vs выполнение

  • Синтаксические ошибки (SyntaxError) — Python не смог прочитать код.
  • - Пример: забыли двоеточие после if, перепутали отступы. - Такие ошибки исправляются до запуска.

  • Ошибки времени выполнения (runtime errors) — код запустился, но во время работы возникла проблема.
  • - Пример: преобразование строки в число, деление на ноль, обращение к несуществующему ключу. - Именно они обычно оформляются как исключения.

    ---

    2) Что такое исключение и зачем оно нужно

    Исключение — это «сигнал о проблеме», который прерывает обычный ход выполнения программы.

    Когда исключение возникает и его никто не обработал, программа завершается и показывает traceback (трассировку стека вызовов).

    Как читать traceback (самый важный навык)

    Пример (формат типичный):

    Как читать:

  • Последняя строка — главное:
  • - тип: ValueError - сообщение: почему ('abc' нельзя превратить в int).
  • Строка File ..., line ... — где это случилось.
  • Блок Traceback ... — путь, как программа пришла к этой точке (цепочка вызовов функций).
  • Практика: сначала смотрите на последнюю строку, затем на ваш файл и номер строки.

    ---

    3) Частые исключения новичка (и что они означают)

    | Исключение | Обычно значит | Типичный пример | |---|---|---| | ValueError | значение «не того формата» | int("abc") | | TypeError | операция над несовместимыми типами | "5" + 2 | | NameError | переменная/имя не определено | print(x) до x = ... | | IndexError | индекс вне диапазона | lst[10] при коротком списке | | KeyError | ключа нет в словаре | d["missing"] | | ZeroDivisionError | деление на ноль | 10 / 0 |

    > Про ошибки файлов (например, FileNotFoundError) см. статью «Работа с файлами и форматами данных (txt, json)» — там важны пути и режимы.

    ---

    4) Обработка исключений: try/except

    Базовый шаблон:

    Ключевые правила:

  • В try помещайте минимальный участок, который реально может упасть.
  • Ловите конкретные исключения, а не всё подряд.
  • Несколько except

    else и finally

  • else выполняется, если ошибок не было.
  • finally выполняется всегда (ошибка была или нет).
  • finally часто нужен для «завершающих действий» (например, закрытие ресурсов). На практике для файлов обычно используют with (см. статью про файлы), поэтому вручную закрывать часто не надо.

    ---

    5) Что не стоит делать: «поймать всё и молчать»

    Плохая практика:

    Почему это опасно:

  • Ошибка исчезает с экрана, но остаётся в программе.
  • Данные могут стать неправильными, а вы не узнаете.
  • Если очень нужно перехватить «почти всё», хотя бы сообщайте об ошибке и контекст:

    ---

    6) raise: как создавать и пробрасывать ошибки

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

    Зачем так делать:

  • функция сразу фиксирует «контракт» (какие входные данные допустимы);
  • ошибка становится понятнее, чем «где-то дальше всё сломалось».
  • Пробросить исключение после обработки

    Иногда вы хотите добавить сообщение/лог, но не «лечить» проблему:

    raise без указания типа означает: «подними то же исключение ещё раз».

    ---

    7) assert: быстрые проверки для отладки

    assert — это «утверждение»: если условие ложно, будет AssertionError.

    Когда уместно:

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

  • для проверки пользовательского ввода в продакшн-логике (лучше if ...: raise ValueError).
  • ---

    8) Отладка: практический алгоритм поиска причины

    Шаг 1: воспроизведите ошибку стабильно

  • Зафиксируйте входные данные, при которых падает.
  • Уберите случайность (если используете random, временно задайте seed).
  • Шаг 2: прочитайте traceback

  • тип исключения;
  • ваша строка в вашем файле;
  • какие значения участвовали.
  • Шаг 3: сузьте место поиска

    Добавьте «контрольные точки»:

    Полезно печатать «технически», чтобы увидеть скрытые символы:

    Шаг 4: используйте отладчик IDE (breakpoints)

    Если вы в VS Code / PyCharm:

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

    <details> <summary>

    Мини-шпаргалка: как найти источник KeyError и IndexError

    </summary>

  • KeyError:
  • 1) распечатайте ключ, который ищете; 2) распечатайте dict.keys(); 3) если ключ необязательный — используйте get() (см. статью про словари).

  • IndexError:
  • 1) распечатайте индекс и len(list); 2) убедитесь, что цикл идёт по корректному диапазону; 3) проверьте, что список не стал короче из‑за pop/remove.

    </details>

    ---

    9) Мини‑практика (самопроверка)

    1) Напишите функцию to_int(s), которая: - пытается превратить строку в int; - если не получилось — возвращает None (перехватите ValueError).

    2) Напишите ввод числа с повтором: - в цикле спрашивайте ввод, пока пользователь не введёт корректное целое; - используйте try/except вместо сложных проверок строки.

    3) Создайте словарь user без ключа "age" и: - аккуратно получите возраст без падения программы; - объясните, почему user["age"] может дать KeyError.

    ---

    Итог

  • Исключения — нормальный механизм сигнализации об ошибках во время выполнения.
  • Умение читать traceback почти всегда быстро приводит к строке и причине.
  • try/except используйте точечно и с конкретными типами ошибок.
  • raise помогает делать ошибки понятными и проверять входные данные.
  • Для поиска причин сочетайте: воспроизведение, traceback, print/repr, и отладчик IDE.
  • 9. Практика: мини-проекты и типовые задачи на Python

    Практика: мини‑проекты и типовые задачи на Python

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

    > Если вы забыли синтаксис: условия/циклы — см. статью про логику программы; коллекции — про list/set/dict; обработку ошибок — про исключения; чтение/запись — про файлы и JSON; разбиение по файлам — про модули и пакеты.

    ---

    1) Универсальный шаблон: как делать мини‑проект

    Шаг 1. Сформулируйте контракт

  • Что программа принимает (ввод пользователя, файл, параметры функции)?
  • Что программа выдаёт (печать в консоль, возвращаемое значение, файл)?
  • Какие ошибки ввода возможны и как реагировать (повторить ввод, показать сообщение, пропустить строку)?
  • Шаг 2. Разбейте на функции

    Держите принцип: одна функция — одна задача.

    Пример карты функций (не код, а план):

    Шаг 3. Добавьте «самопроверку»

  • Несколько заранее подготовленных сценариев ввода.
  • Проверка крайних случаев: пустой список, несуществующий ключ, неверное число.
  • ---

    2) Мини‑проект №1: CLI‑трекер задач (ToDo)

    Цель: тренировка dict/list, функций, циклов, простого меню, сохранения в JSON.

    Требования (MVP)

  • Команды в цикле:
  • - add — добавить задачу (текст) - list — показать задачи с номерами - done — отметить задачу выполненной по номеру - remove — удалить по номеру - exit — выход
  • Данные хранятся в структуре вида:
  • - список словарей: [{"text": "...", "done": False}, ...]
  • При старте загрузите tasks.json (если файла нет — стартуйте с пустого списка).
  • При выходе сохраните обратно в tasks.json.
  • Подсказки по реализации

  • Номер задачи для пользователя удобнее начинать с 1, а индекс в списке — с 0 (помните про преобразование).
  • Для некорректного номера используйте обработку ошибок (см. статью про исключения): неверное число, номер вне диапазона.
  • Идеи улучшений

  • Команда search (по подстроке в тексте).
  • При list показывать только невыполненные или фильтр all/active/done.
  • Автосохранение после каждой команды.
  • <details> <summary>

    Критерии готовности

    </summary>

  • Программа не падает при неверном вводе номера.
  • После перезапуска задачи сохраняются.
  • Команды не «ломают» данные: после remove и done список остаётся корректным.
  • </details>

    ---

    3) Мини‑проект №2: анализатор текстового файла

    Цель: тренировка работы с .txt, строками, словарями, сортировкой результатов.

    Требования (MVP)

  • Прочитайте файл input.txt (кодировка utf-8).
  • Посчитайте:
  • - количество строк - количество слов - топ‑10 самых частых слов
  • Нормализация слов:
  • - привести к нижнему регистру - убрать знаки пунктуации по краям (например, "слово," -> "слово")

    Структура решения

  • read_lines(path) -> list[str]
  • tokenize(line) -> list[str]
  • count_words(words) -> dict[str, int]
  • top_n(freq, n) -> list[tuple[str, int]]
  • Частые ловушки

  • Пустые строки: после разбиения/очистки могут появляться пустые токены — их надо пропускать.
  • Сравнение строк с \n: при чтении построчно используйте strip() или точечное удаление \n.
  • Идеи улучшений

  • Сохранить отчёт в report.txt.
  • Игнорировать «стоп‑слова» (например, и, в, на) через set.
  • ---

    4) Мини‑проект №3: «касса» — учёт покупок и итогов

    Цель: тренировка вычислений, структуры данных, форматирования вывода, функций.

    Требования (MVP)

  • В цикле вводите позиции покупки: название, цена, количество.
  • Команды:
  • - add — добавить позицию - total — показать итоговую сумму - check — вывести «чек» списком - exit — выход
  • Хранение данных: список словарей [{"name": ..., "price": ..., "qty": ...}].
  • Что важно продумать

  • Проверка цены и количества: неотрицательные числа.
  • Итог позиции: price * qty.
  • Идеи улучшений

  • Скидка в процентах для всего чека.
  • Экспорт в JSON (например, check.json).
  • ---

    5) Мини‑проект №4: конвертер форматов (TXT ⇄ JSON)

    Цель: практиковать файлы и JSON, валидацию входных данных.

    Вариант A: TXT → JSON

  • В users.txt каждая строка: name;age;city
  • Прочитать, превратить в список словарей и сохранить в users.json.
  • Вариант B: JSON → TXT

  • Из users.json (список объектов) сделать users_export.txt в том же формате.
  • Обязательная устойчивость

  • Пропускать строки, где не хватает полей.
  • Если age не число — либо пропустить строку, либо поставить None (и явно решить правило).
  • ---

    6) Типовые задачи (быстрые тренажёры)

    | Задача | Навыки | Мини‑критерий | |---|---|---| | Удалить дубликаты, сохранив порядок | list, set | работает на [], на списке с повторами | | Подсчитать частоты элементов | dict | корректно считает для строк/чисел | | Слить два словаря настроек (второй важнее) | dict | ключи из второго перезаписывают первый | | Проверить «валидность» ввода (число в диапазоне) | try/except | не падает на abc, просит повтор | | Разбить программу на main.py + utils.py | модули | импортируется без побочных эффектов |

    <details> <summary>

    Как понять, что вы действительно «написали программу», а не набор строк

    </summary>

  • Есть функции с понятными именами, а не один длинный main.
  • Ошибки ввода обрабатываются: пользователь может ошибаться, программа живёт дальше.
  • Данные можно сохранить/загрузить (если задача про хранение).
  • Для каждого действия есть повторяемый сценарий проверки (мини‑тест руками).
  • </details>

    ---

    Итог

    Мини‑проекты выше специально подобраны так, чтобы вы комбинировали базовые элементы Python в «боевые» сценарии: меню, структуры данных, обработка ошибок, чтение/запись и аккуратная организация кода по функциям и модулям. Выберите один проект, доведите до критериев готовности, затем добавьте 1–2 улучшения — так навык растёт быстрее всего.