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

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

1. Установка Python и первые шаги

Установка Python и первые шаги

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

Python — это язык программирования и одновременно программа, которая выполняет ваш код. Когда вы устанавливаете Python, вы ставите на компьютер:

  • Интерпретатор Python (то, что запускает программы)
  • Стандартные инструменты, например pip (установка пакетов)
  • Стандартную библиотеку (готовые модули, которые идут вместе с Python)
  • В этом уроке вы установите Python, проверите, что он работает, научитесь запускать код несколькими способами и создадите первую мини-программу.

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

    Для обучения и большинства задач выбирайте Python 3 (актуальную стабильную версию с сайта Python). Важно: Python 2 — устаревший и для современного обучения не подходит.

    Официальная страница загрузки:

  • Python Downloads
  • Установка Python на Windows

    Установка с официального сайта

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

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

  • Откройте PowerShell или Командную строку.
  • Выполните команду:
  • Ожидаемый результат: строка вида Python 3.x.x.

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

    На Windows часто работает Python Launcher (py), даже если python не доступен в PATH.

    Установка Python на macOS

    Рекомендуемый вариант: официальный установщик

  • Откройте Python Downloads.
  • Скачайте установщик для macOS.
  • Установите Python.
  • Проверка установки

    Откройте Terminal и выполните:

    На macOS команда python может указывать на системный Python или быть недоступной, поэтому чаще используют python3.

    Установка Python на Linux

    На большинстве дистрибутивов Python уже установлен. Важно проверить версию:

    Если Python 3 отсутствует, установите через менеджер пакетов вашего дистрибутива (например, apt, dnf, pacman). Команды различаются, поэтому ориентируйтесь на документацию вашего Linux.

    Редактор кода и среда разработки

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

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

  • Visual Studio Code (лёгкий и универсальный редактор)
  • - Visual Studio Code - Расширение: Python extension for Visual Studio Code
  • PyCharm Community Edition (IDE, особенно удобна для Python)
  • - PyCharm

    На старте достаточно VS Code или PyCharm. Главное — чтобы вы могли создавать файл .py и запускать его.

    Первый запуск Python: интерактивный режим

    Интерактивный режим (REPL) удобен, чтобы быстро проверить идею или команду.

  • Откройте терминал.
  • Запустите Python:
  • или (на macOS/Linux чаще так):

  • Введите выражение:
  • Чтобы выйти:

  • На Windows: Ctrl+Z, затем Enter
  • На macOS/Linux: Ctrl+D
  • Первая программа в файле

    Интерактивный режим хорош для экспериментов, но реальные программы хранятся в файлах.

  • Создайте папку для курса, например python-course.
  • Внутри создайте файл hello.py.
  • Добавьте код:
  • Запустите файл из терминала, перейдя в папку с ним:
  • Если у вас macOS/Linux, возможно нужно так:

    !Как код из файла проходит через интерпретатор и превращается в вывод

    Что такое pip и зачем он нужен

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

    Проверка, что pip доступен:

    На macOS/Linux иногда:

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

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

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

    Когда вы ставите пакеты через pip, важно понимать куда они ставятся. Лучший подход — отдельные окружения для разных проектов.

    Виртуальное окружение — это папка с изолированной копией Python-настроек и пакетов для конкретного проекта.

    Создание виртуального окружения

  • Откройте терминал в папке проекта.
  • Создайте окружение (обычно называют .venv):
  • На macOS/Linux может понадобиться python3.

    Активация

    Windows (PowerShell):

    Windows (cmd):

    macOS/Linux:

    После активации в терминале обычно появляется пометка окружения, и pip install ... будет ставить пакеты внутрь проекта.

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

  • venv — Creation of virtual environments
  • Частые проблемы и как их решить

  • Команда python не находится
  • - Windows: переустановите Python и убедитесь, что включили Add python.exe to PATH, либо используйте py. - macOS/Linux: используйте python3.
  • Установлено несколько Python, путаются версии
  • - Проверяйте версии командами python --version, python3 --version, py --version. - Для пакетов используйте точную форму: python -m pip ....
  • pip ставит “не туда”
  • - Создайте и активируйте виртуальное окружение, затем ставьте пакеты.
  • Проблемы с кодировкой/русским текстом в терминале
  • - В современных системах чаще всего всё работает автоматически. - Если видите “кракозябры”, попробуйте сменить терминал (например, Windows Terminal) или шрифт/кодировку.

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

  • Python запускает код либо в интерактивном режиме, либо из .py файла.
  • Проверять версию и запускать инструменты надёжнее через python -m ....
  • Для проектов используйте виртуальные окружения venv.
  • В следующем материале логично перейти к базовому синтаксису: переменные, типы данных и простые операции — чтобы вы уже уверенно писали небольшие программы.

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

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

    Как читать и писать код на Python

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

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

    Команды и выражения

  • Команда (инструкция) — действие, которое выполняет Python (например, присвоить значение переменной или вывести текст).
  • Выражение — то, что можно вычислить и получить значение (например, 2 + 3, "a" * 3, len("hi")).
  • Пример:

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

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

  • После строк, которые начинаются блоком (например, if, for, while, def), ставится двоеточие :.
  • Внутри блока обычно используют 4 пробела на один уровень отступа.
  • Комментарии

    Комментарий — это текст для людей, Python его игнорирует.

    Переменные

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

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

  • Имя может состоять из букв, цифр и _, но не может начинаться с цифры.
  • Регистр важен: name и Name — разные имена.
  • Лучше использовать стиль snake_case: user_name, total_sum.
  • Типы данных: что именно хранится в переменных

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

    !Как переменная связана со значением и его типом

    Числа: int и float

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

  • +, -, *, / — обычные арифметические операции
  • // — целочисленное деление (без дробной части)
  • % — остаток от деления
  • ** — степень
  • Строки: str

    Строка — это текст. В Python строки записывают в кавычках.

    Основные операции со строками:

  • Склейка строк через +
  • Повтор строки через *
  • Получение длины через len(...)
  • #### f-строки: удобная подстановка значений

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

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

    bool имеет два значения: True и False.

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

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

  • == равно
  • != не равно
  • >, <, >=, <=
  • Логические операции:

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

    None означает “нет значения” или “не задано”.

    Это полезно, когда значение появится позже или когда нужно явно показать отсутствие данных.

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

    Иногда данные приходят в одном виде, а нужны в другом.

  • int("123") превращает строку в целое число
  • float("3.14") превращает строку в число с дробной частью
  • str(10) превращает число в строку
  • bool(...) превращает значение в True/False по правилам Python
  • Пример:

    Важно: int("12.5") вызовет ошибку, потому что это не целое число. В таком случае сначала float("12.5").

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

    print()

    print() выводит значения на экран.

    input()

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

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

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

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

    Исправление:

    Мини-практика: короткая программа в одном файле

    Создайте файл profile.py и напишите:

    Запустите так же, как в прошлом уроке: python profile.py (или python3 profile.py).

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

  • Код в Python структурируется отступами.
  • Переменная — имя для значения.
  • Базовые типы: int, float, str, bool, None.
  • input() всегда возвращает строку, числа нужно получать через int(...) или float(...).
  • Дополнительно можно свериться с официальной документацией:

  • Python Tutorial
  • Built-in Types
  • 3. Условия, циклы и логика программы

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

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

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

    Чтобы программа была умной и реагировала на данные, нужны два инструмента:

  • Условия: выполнить разные действия в зависимости от ситуации.
  • Циклы: повторять действия много раз, пока не выполнится нужное условие.
  • Вместе они формируют логику программы: ветвления, повторения и контроль выполнения.

    !Общая схема: ветвление через if и повторение через цикл

    Логические выражения: что такое условие

    Условие в Python — это выражение, результат которого имеет тип bool: True или False.

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

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

    | Оператор | Значение | Пример | |---|---|---| | == | равно | a == b | | != | не равно | a != b | | > | больше | a > b | | < | меньше | a < b | | >= | больше или равно | a >= b | | <= | меньше или равно | a <= b |

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

    Иногда одного сравнения недостаточно, и нужно объединять условия:

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

    Базовая форма: if и else

    Важно:

  • После if и else ставится :.
  • Внутри блока используются отступы (обычно 4 пробела).
  • Несколько вариантов: elif

    elif читается как “иначе если” и позволяет сделать несколько веток.

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

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

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

    “Истинность” значений: как Python понимает True и False

    Не всегда в условии пишут сравнение. Python умеет интерпретировать некоторые значения как “истина/ложь”.

    Примеры:

    Пустая строка "" считается ложью, а любая непустая строка — истиной.

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

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

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

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

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

    Пример: проверка ввода

    Частая задача — просить ввод, пока он не станет корректным.

    isdigit() — метод строки: возвращает True, если строка состоит только из цифр.

    Цикл for: повторяем заданное количество раз

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

    range(): генератор чисел для цикла

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

    range(a, b) даёт числа от a до b - 1.

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

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

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

    while True — распространённый шаблон для бесконечного цикла с выходом через break.

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

    Когда выполняется continue, цикл сразу переходит к следующему шагу.

    Типичные ошибки

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

    Создайте файл menu.py.

    Идея: программа показывает меню и повторяет его, пока пользователь не выберет выход.

    Здесь используются сразу все ключевые элементы урока: if/elif/else, while, break и проверки данных.

    Что почитать в официальной документации

  • The if statement
  • for Statements
  • The range() Function
  • break and continue
  • Что запомнить

  • Условия строятся на сравнениях и логических операторах и дают True или False.
  • if/elif/else выбирают, какой блок кода выполнить.
  • while повторяет, пока условие истинно.
  • for с range() повторяет заданное число раз.
  • break завершает цикл, continue пропускает текущий шаг.
  • 4. Функции, модули и работа с пакетами

    Функции, модули и работа с пакетами

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

    В прошлых уроках вы писали программы как последовательность команд с условиями if/elif/else и циклами for/while. По мере роста программы появляется проблема: код становится длинным, повторяется и его сложно читать.

    Для решения используют:

  • Функции: позволяют выделить повторяющуюся логику в именованный блок кода.
  • Модули: позволяют хранить код в отдельных файлах .py и переиспользовать его.
  • Пакеты: это наборы модулей, которые можно установить (например, через pip).
  • !Как функции и модули собираются в проект, а пакеты ставятся в окружение

    Функции

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

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

    Плюсы функций:

  • код не повторяется
  • код легче тестировать и читать
  • программу проще расширять
  • Объявление функции: def

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

  • def greet(name): создаёт функцию с именем greet
  • name — параметр (данные, которые функция получает)
  • строки с отступом — тело функции
  • greet("Аня") — вызов функции
  • Возврат значения: return

    Если функция должна выдать результат, используют return.

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

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

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

    Можно задать значение параметра, если его не передали при вызове.

    Область видимости: где существует переменная

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

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

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

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

    Докстроки полезны в редакторах кода и при чтении чужих проектов.

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

  • Определение функций в Python (tutorial)
  • Модули

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

    Модуль — это файл .py. Всё, что вы писали до этого (например, menu.py), уже является модулем.

    Зачем делить программу на модули:

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

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

  • main.py
  • utils.py
  • Файл utils.py:

    Файл main.py:

    Популярные стили импорта

    | Задача | Пример | Как обращаться | |---|---|---| | Импорт модуля целиком | import math | math.sqrt(9) | | Импорт конкретного имени | from math import sqrt | sqrt(9) | | Импорт с псевдонимом | import math as m | m.sqrt(9) |

    Подход для новичка:

  • если модуль маленький и вы активно используете его функции, допустим from ... import ...
  • если важна ясность, откуда пришла функция, используйте import module и префикс module.
  • Официальная справка:

  • Модули в Python (tutorial)
  • Как Python выполняет модуль и зачем нужен __name__ == "__main__"

    Если вы запускаете файл напрямую:

    то внутри этого файла переменная __name__ будет равна строке "__main__".

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

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

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

  • модуль можно импортировать, не запуская «главный сценарий»
  • удобнее тестировать функции и переиспользовать код
  • Официальная справка:

  • Модуль __main__ в Python
  • Пакеты и pip

    Пакет в Python: два смысла

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

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

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

    Из прошлого урока вы уже знаете про venv. Базовая привычка такая:

  • создать .venv в проекте
  • активировать окружение
  • только потом ставить пакеты
  • Официальная справка:

  • venv — виртуальные окружения
  • Установка пакета через pip

    Команда, которую удобно запомнить:

    Почему именно так:

  • python -m pip гарантирует, что pip относится к этому Python и этому окружению
  • Документация pip:

  • pip documentation
  • Использование установленного пакета: пример с requests

    requests — популярная библиотека для HTTP-запросов.

    Важно:

  • если пакет не установлен в текущем окружении, импорт упадёт с ошибкой ModuleNotFoundError
  • Документация requests:

  • Requests: HTTP for Humans
  • Где смотреть, что установлено

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

    Посмотреть информацию о конкретном пакете:

    Небольшая рекомендация по структуре учебного проекта

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

  • main.py для запуска
  • utils.py для вспомогательных функций
  • отдельные файлы для больших частей логики
  • Мини-правило читаемости:

  • функции делают одну понятную вещь
  • имена функций описывают действие: calculate_total, is_valid_age, format_user_name
  • Что запомнить

  • Функции создаются через def, принимают параметры и могут возвращать результат через return.
  • Переменные внутри функции обычно локальные.
  • Модуль — это файл .py, его подключают через import.
  • Конструкция if __name__ == "__main__": отделяет запуск сценария от кода, который можно импортировать.
  • Пакеты ставятся через python -m pip install ..., лучше внутри виртуального окружения.
  • 5. Структуры данных: списки, словари, множества, кортежи

    Структуры данных: списки, словари, множества, кортежи

    Зачем нужны структуры данных

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

    Для этого в Python есть удобные структуры данных:

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

    Как выбрать подходящую структуру

    | Структура | Когда использовать | Ключевая особенность | |---|---|---| | list | когда важен порядок и нужно добавлять/удалять/менять элементы | изменяемая, есть индексы | | tuple | когда важен порядок, но данные не должны меняться | неизменяемая, есть индексы | | dict | когда нужно быстро находить значение по ключу (например, по имени поля) | пары ключ-значение | | set | когда важна уникальность и проверки “есть ли элемент” | только уникальные элементы |

    Списки (list)

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

    Список записывают в квадратных скобках:

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

    У списка есть порядок, поэтому элементы можно брать по индексу.

  • Первый элемент: индекс 0
  • Последний элемент: индекс -1
  • Срез — это “кусок списка”:

    Важно: правая граница в срезе не включается.

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

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

    Частые методы:

  • append(x) — добавить в конец
  • extend(other) — добавить все элементы из другой коллекции
  • insert(i, x) — вставить по индексу
  • pop() или pop(i) — удалить и вернуть элемент
  • remove(x) — удалить первое вхождение значения
  • sort() — сортировка (изменяет список)
  • Перебор списка в цикле

    В прошлом уроке вы использовали for и range(). Со списком чаще перебирают прямо элементы:

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

    Проверка “есть ли элемент”

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

    Кортежи (tuple)

    Зачем нужен кортеж

    Кортеж похож на список, но его нельзя менять. Это полезно, когда:

  • данные должны оставаться фиксированными
  • вы хотите явно показать, что набор значений — “константный”
  • Создание кортежа

    Кортеж из одного элемента требует запятую:

    Индексация и перебор

    Индексация и перебор — как у списка:

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

    Очень полезный приём — разложить кортеж по переменным:

    Словари (dict)

    Идея словаря: ключ → значение

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

    Ключами чаще всего делают строки, а значениями — что угодно: числа, строки, списки.

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

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

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

    Удаление

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

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

    Часто удобнее использовать:

  • items() — пары (key, value)
  • keys() — ключи
  • values() — значения
  • Проверка наличия ключа

    in у словаря проверяет ключи, а не значения:

    Множества (set)

    Что такое множество

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

    Пустое множество создают не через {}, потому что {} — это пустой словарь. Правильно так:

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

    Быстрая проверка “есть ли элемент”

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

    Множества удобно использовать, когда нужно работать с пересечением и объединением наборов.

  • a | b — объединение (всё, что есть хотя бы в одном)
  • a & b — пересечение (только общее)
  • a - b — разность (что есть в a, но нет в b)
  • Практический пример: найти общие интересы двух пользователей.

    Важная тема: изменяемость

    У структур данных есть принципиальная разница.

  • изменяемые: list, dict, set
  • неизменяемые: tuple (а также базовые int, float, str, bool)
  • Это влияет на то, можно ли “поменять объект на месте”.

    Частая ошибка со списками: копия и “тот же самый список”

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

    Если нужна копия, можно сделать так:

    Мини-практика без “магии”: пример, где нужны все структуры

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

  • вывести уникальные товары
  • посчитать, сколько раз встречается каждый товар
  • сохранить “неизменяемую” версию итогового списка
  • Здесь:

  • list хранит исходные данные
  • set убирает повторы
  • dict хранит счётчик
  • tuple фиксирует результат, чтобы его “случайно” не поменять
  • Что почитать в официальной документации

  • Built-in Types
  • Data Structures (tutorial)
  • Что запомнить

  • list — когда нужен порядок и изменения.
  • tuple — когда нужен порядок, но изменения не должны происходить.
  • dict — когда нужно хранить данные по ключам и быстро получать значения.
  • set — когда важна уникальность и удобны операции над наборами.
  • in работает по-разному: у списка проверяет элементы, у словаря — ключи.
  • 6. Файлы, исключения и отладка

    Файлы, исключения и отладка

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

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

    Теперь добавим три ключевые практические вещи:

  • Файлы: чтобы программа могла сохранять результаты и читать данные не только из консоли.
  • Исключения: чтобы программа не “падала” при ошибках ввода, отсутствующих файлах и других проблемах.
  • Отладка: чтобы быстро находить и исправлять ошибки в логике.
  • !Общая картина: где в программе появляются файлы и исключения

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

    Что такое файл для программы

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

  • открыть файл
  • прочитать или записать данные
  • закрыть файл
  • Закрывать файл важно, иначе данные могут не записаться полностью, а сам файл может остаться “занятым” системой.

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

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

    Параметры:

  • "data.txt" — имя файла (путь)
  • режим "r" — чтение
  • encoding="utf-8" — кодировка (важно для русского текста)
  • Документация:

  • open() — built-in function
  • Контекстный менеджер: with open(...) as f

    Самый правильный и распространённый способ — использовать with. Тогда файл закроется автоматически, даже если возникнет ошибка.

    Запомните правило: если работаете с файлами — почти всегда используйте with.

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

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

    Чтение из файла

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

    Чтение построчно (удобно для больших файлов):

    Здесь rstrip() убирает символ перевода строки в конце, чтобы print() не добавлял “пустые строки”.

    Запись в файл

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

    Дозаписать в конец:

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

  • Относительный путь считается от текущей папки запуска.
  • Абсолютный путь — полный путь в системе.
  • Частая проблема новичков: файл “не находится”, потому что программа запускается из другой папки.

    Чтобы удобнее работать с путями, используйте pathlib:

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

  • pathlib — Object-oriented filesystem paths
  • Исключения: как Python сообщает об ошибках

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

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

    Примеры:

  • ValueError — неверный формат данных (например, int("abc"))
  • FileNotFoundError — файл не найден
  • ZeroDivisionError — деление на ноль
  • KeyError — нет ключа в словаре при обращении через d[key]
  • Исключения полезны тем, что дают точное место и причину ошибки. Но если их не обработать, программа завершится.

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

  • Built-in Exceptions
  • Обработка ошибок: try / except

    Пример: пользователь вводит число, но может ошибиться.

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

  • в try кладём “опасный” код
  • в except описываем, что делать, если произошла ошибка
  • Несколько except для разных ошибок

    else и finally

  • else выполняется, если ошибок не было
  • finally выполняется всегда (и при успехе, и при ошибке)
  • Не делайте “пустой” except

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

    Почему плохо:

  • вы ловите все ошибки подряд, включая неожиданные
  • становится трудно понять настоящую причину проблемы
  • Лучше ловить конкретные исключения (например, ValueError).

    Как “поднять” исключение самому: raise

    Иногда вы пишете функцию и хотите явно запретить неправильные входные данные.

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

    Отладка: как находить ошибки быстрее

    Два типа проблем

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

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

    Привычка:

  • смотрите на последнюю строку traceback: там тип ошибки (например, ValueError) и сообщение
  • поднимайтесь выше: там файл и номер строки
  • Самый простой способ отладки: контрольные print()

    Это нормально для небольших учебных задач.

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

    breakpoint() и встроенный отладчик

    Python умеет останавливать программу в нужном месте.

    Когда выполнение дойдёт до breakpoint(), вы сможете смотреть значения переменных и выполнять команды по шагам.

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

  • pdb — The Python Debugger
  • Отладчик в IDE

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

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

    Мини-проект: “Заметки” с сохранением в файл и обработкой ошибок

    Задача: сделать простую программу, которая:

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

    Что здесь закрепляется:

  • функции (add_note, show_notes, run)
  • работа с файлами через with open(...)
  • обработка FileNotFoundError
  • структура запуска через if __name__ == "__main__":
  • Что запомнить

  • Для файлов почти всегда используйте with open(...) as f:.
  • Явно указывайте encoding="utf-8", если работаете с русским текстом.
  • Исключения — нормальная часть программы; их нужно обрабатывать там, где ошибка ожидаема.
  • Ловите конкретные исключения, а не “всё подряд”.
  • Для отладки используйте traceback, print() и breakpoint() (или отладчик IDE).
  • Полезные ссылки:

  • Reading and Writing Files
  • Built-in Exceptions
  • pdb — The Python Debugger
  • 7. Основы ООП и мини‑проект

    Основы ООП и мини‑проект

    Зачем вам ООП после функций, структур данных и файлов

    Ранее вы научились:

  • писать логику на if и циклах
  • выносить повторяющийся код в функции и модули
  • хранить данные в list, dict, set, tuple
  • читать и записывать файлы, обрабатывать ошибки через try/except
  • Когда программа становится больше, появляется типичная ситуация: есть сущности (например, заметка, пользователь, задача), у каждой есть данные и действия. Объектно‑ориентированное программирование (ООП) помогает объединять данные и поведение в одно целое.

    ООП особенно полезно, когда:

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

    Класс и объект простыми словами

  • Класс — это шаблон (описание), как будет выглядеть сущность.
  • Объект (экземпляр класса) — конкретная сущность, созданная по шаблону.
  • Пример из жизни:

  • класс: «Задача»
  • объект: «Купить молоко»
  • Атрибуты и методы

    У объектов есть:

  • атрибуты — данные (например, title, done)
  • методы — функции, привязанные к объекту (например, mark_done())
  • Первый класс

    Что здесь важно:

  • class Task: объявляет класс.
  • __init__конструктор: вызывается при создании объекта.
  • self — ссылка на сам объект, который сейчас «обслуживает» метод.
  • Как работает self

    self передаётся неявно при вызове метода.

    Эти два варианта эквивалентны:

    Поэтому почти все методы класса первым параметром принимают self.

    Инкапсуляция: прячем детали, оставляем удобный интерфейс

    Инкапсуляция — это подход, при котором вы скрываете внутренние детали и даёте внешнему коду понятные методы.

    В Python нет «жёстких» приватных полей как в некоторых языках, но есть соглашения:

  • name — публичный атрибут
  • _nameвнутренний (не трогать снаружи без необходимости)
  • __name — «усиленно скрытый» (name mangling), используется реже
  • Практический смысл: вы снижаете риск случайно сломать состояние объекта.

    Композиция: объект внутри объекта

    Композиция — это когда один объект хранит внутри себя другие объекты.

    Например, TaskList хранит список Task.

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

    Наследование: когда один класс расширяет другой

    Наследование — это способ сделать новый класс на основе существующего.

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

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

  • DeadlineTask(Task) означает: DeadlineTask наследуется от Task.
  • super().__init__(title) вызывает конструктор родителя, чтобы не дублировать код.
  • Когда наследование уместно:

  • новый класс действительно является «тем же самым, но расширенным»
  • базовый класс задаёт общий интерфейс
  • Когда лучше композиция:

  • различия слишком большие
  • вы хотите «собрать» поведение из частей, а не строить иерархию
  • Полезные «магические» методы (dunder методы)

    В Python у объектов есть специальные методы, которые позволяют им красиво вести себя в языке.

    __str__ для удобного отображения

    __repr__ для отладки

    __repr__ обычно делают более «техническим», чтобы было понятно состояние объекта.

    Мини‑проект: консольный менеджер задач с сохранением в файл

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

  • ООП: классы Task и TaskManager
  • структуры данных: список задач внутри менеджера
  • файлы: сохранение в tasks.json
  • исключения: обработка отсутствующего файла и ошибок формата
  • Что будет уметь программа

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

    Используем JSON, потому что:

  • он читаемый
  • стандартная библиотека Python уже содержит модуль json
  • Документация:

  • Модуль json
  • Код проекта в одном файле

    Создайте файл task_app.py.

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

  • Task отвечает только за одну задачу: хранит данные и умеет превращаться в словарь.
  • TaskManager отвечает за коллекцию задач и за сохранение/загрузку.
  • Валидация входных данных сделана через raise ValueError(...), а пользовательский сценарий ловит ошибки через try/except.
  • Файл хранится рядом со скриптом через Path(__file__).parent.
  • Почему здесь используется @dataclass

    dataclass — часть стандартной библиотеки. Он автоматически создаёт полезный конструктор и делает класс короче, когда он в основном хранит данные.

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

  • Модуль dataclasses
  • Что запомнить

  • Класс описывает сущность, объект — конкретный экземпляр.
  • Атрибуты хранят данные, методы описывают поведение.
  • __init__ настраивает объект при создании, а self указывает на текущий объект.
  • Инкапсуляция делает код безопаснее и понятнее через аккуратный интерфейс.
  • Композиция часто проще наследования: «менеджер содержит задачи».
  • ООП хорошо сочетается с файлами и исключениями: объекты можно сохранять и восстанавливать.