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

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

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

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

Зачем нужен Python

Python — это язык программирования, на котором можно создавать:

  • Скрипты для автоматизации рутинных задач
  • Веб-приложения и API
  • Аналитику данных и визуализации
  • Машинное обучение
  • Прототипы и учебные проекты
  • Сильные стороны Python:

  • Простой и читаемый синтаксис
  • Большое сообщество и множество готовых библиотек
  • Кроссплатформенность (Windows, macOS, Linux)
  • Как устроен Python: интерпретатор и программы

    Когда вы пишете код на Python, вы сохраняете его в файл (обычно с расширением .py). Затем этот файл выполняет интерпретатор Python — программа, которая читает ваш код и исполняет его.

    !Простая схема: как файл с кодом выполняется интерпретатором Python

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

  • Python (язык) — правила, по которым пишется код
  • Python (интерпретатор) — программа, которая запускает этот код
  • Версии Python: что выбрать

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

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

  • Установите актуальную стабильную версию Python 3 с официального сайта
  • Официальные источники:

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

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

  • Путь (PATH) — настройка системы, позволяющая запускать команду python из терминала/командной строки
  • Терминал/командная строка — приложение, где вы вводите команды (например, python --version)
  • Windows

  • Перейдите на сайт Python Downloads и скачайте установщик для Windows.
  • Запустите установщик.
  • Обязательно поставьте галочку Add python.exe to PATH (или аналогичную формулировку).
  • Выберите установку (обычно подходит Install Now).
  • Откройте Command Prompt (cmd) или PowerShell и проверьте установку:
  • Если команда не находится, значит Python не добавился в PATH — это можно исправить переустановкой или настройкой переменных среды.

    macOS

  • Перейдите на сайт Python Downloads и скачайте установщик для macOS.
  • Установите Python, следуя шагам мастера.
  • Откройте Terminal и проверьте версию:
  • На macOS команда может быть именно python3, потому что слово python иногда связано с системными настройками.

    Linux

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

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

    Редактор кода и IDE: где писать программы

    Вам нужен инструмент, где удобно:

  • Писать код с подсветкой синтаксиса
  • Запускать программы
  • Видеть ошибки и подсказки
  • Популярные варианты:

    | Инструмент | Что это | Кому подходит | Плюсы | Минусы | |---|---|---|---|---| | Visual Studio Code | Редактор кода с расширениями | Почти всем | Лёгкий, гибкий, много плагинов | Нужно поставить расширения для Python | | PyCharm | IDE для Python | Тем, кто хочет «всё сразу» | Мощные подсказки, удобная навигация | Может быть тяжелее, часть функций в Professional версии |

    Если вы не уверены, что выбрать: начните с Visual Studio Code, потому что он универсален.

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

    Есть два основных способа работать с Python.

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

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

    Запуск:

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

    Пример:

    Выход обычно командой exit().

    Запуск файла .py

  • Создайте файл hello.py.
  • Напишите код:
  • Запустите из терминала в папке с файлом:
  • Если у вас macOS/Linux и команда python не срабатывает, используйте:

    Пакеты и pip: как подключать библиотеки

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

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

    Проверка:

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

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

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

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

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

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

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

    Активация:

  • Windows (PowerShell):
  • Windows (cmd):
  • macOS/Linux:
  • После активации установка пакетов через pip будет происходить внутри этого окружения.

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

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

  • venv — Creation of virtual environments
  • Рекомендуемая структура первого проекта

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

  • project/ — папка проекта
  • project/hello.py — ваш код
  • project/.venv/ — виртуальное окружение (обычно добавляют в исключения, чтобы не отправлять в репозиторий)
  • project/README.md — описание проекта (необязательно, но полезно)
  • Типичные проблемы и быстрые решения

  • Команда python не находится
  • Установите Python с Python Downloads и проверьте настройку PATH
  • pip ставит пакеты «не туда»
  • Используйте python -m pip ... и работайте в активированном venv
  • В VS Code не запускается код тем Python, который вы установили
  • Выберите интерпретатор в VS Code: откройте палитру команд и найдите выбор интерпретатора Python (обычно он предлагает .venv)
  • Что дальше по курсу

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

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

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

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

    Что такое данные и типы данных

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

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

    В Python типы данных определяют, например:

  • можно ли складывать значения;
  • как они сравниваются;
  • как они выводятся на экран;
  • сколько памяти обычно занимают.
  • Официальная справка: Built-in Types.

    Переменные: как Python хранит значения

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

    Создание переменной происходит при присваивании с помощью =:

    Важный нюанс: = в Python — это не «равно» как в математике, а присвоение.

    !Схема показывает, что имя переменной ссылается на объект со значением и типом

    Правила именования переменных

    В Python принято использовать стиль snake_case.

    Хорошие имена:

  • user_name
  • total_price
  • is_valid
  • Что важно помнить:

  • имя может содержать буквы, цифры и _, но не может начинаться с цифры;
  • регистр важен: name и Name — разные переменные;
  • не используйте ключевые слова Python (например, if, for, class).
  • Базовые типы данных

    Целые числа int

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

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

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

    Особенность: из-за внутреннего представления float некоторые дроби могут храниться неточно.

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

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

    bool часто появляется как результат сравнений.

    Строки str

    str — текстовые данные.

    Строки можно объединять:

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

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

    Это полезно, когда переменная нужна, но конкретного значения пока нет.

    Коллекции: несколько значений в одной переменной

    Список list

    list хранит упорядоченный набор элементов, который можно изменять.

    Кортеж tuple

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

    Словарь dict

    dict хранит пары ключ → значение.

    Множество set

    set хранит уникальные элементы (без повторов).

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

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

    Для преобразования типов часто применяют int(), float(), str(), bool().

    Примеры:

    Важно: если строка не выглядит как число, int("abc") вызовет ошибку.

    Базовые операции

    Арифметика

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

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

    Сравнения

    Операторы сравнения возвращают bool:

  • == равно
  • != не равно
  • > больше
  • < меньше
  • >= больше или равно
  • <= меньше или равно
  • Логические операции

    Логические операторы работают с True и False:

  • andи
  • orили
  • notне
  • Операции со строками

    Повторение строки:

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

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

    Частая задача — собрать текст с переменными. Самый удобный способ в современном Python — f-строки.

    Подстановка выражений тоже возможна:

    Документация: Formatted string literals.

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

    Для вывода на экран используйте print():

    Для ввода данных от пользователя — input():

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

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

  • Путать присваивание и сравнение
  • - Присваивание: x = 10 - Сравнение: x == 10

  • Забывать про тип результата input()
  • - input() даёт строку, поэтому "2" + "2" будет "22", а не 4

  • Смешивать строки и числа без преобразования
  • - Нельзя сделать "Возраст: " + 25 - Решение: "Возраст: " + str(25) или f"Возраст: {25}"

    Что дальше

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

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

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

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

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

  • Как выполнить код только если выполнено условие?
  • Как повторять действие много раз?
  • Как остановить повторение раньше или пропустить часть шагов?
  • Условные конструкции: if, elif, else

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

    Простейшая форма:

    Если условие ложно, блок внутри if пропускается.

    Полная форма: if + elif + else

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

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

  • Проверки идут сверху вниз.
  • Выполняется первый блок, условие которого оказалось истинным.
  • else срабатывает, если не сработало ни одно условие выше.
  • !Блок-схема, показывающая, как if/elif/else выбирает один из нескольких путей

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

    В Python отступы определяют границы блока. Обычно используют 4 пробела.

    Неправильно (разные отступы):

    Правильно (единый отступ):

    Что можно писать в условиях

    Чаще всего используются:

  • сравнения: ==, !=, >, <, >=, <=
  • логика: and, or, not
  • Пример с логикой:

    Приведение к bool и “истинность” значений

    Не всегда в if пишут явное сравнение. Python умеет трактовать многие значения как True или False.

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

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

    Это удобно, но в начале обучения важно понимать, что здесь происходит: if text: проверяет не “строка равна чему-то”, а её истинность.

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

  • Путать = и ==
  • Сравнивать число и строку после input()
  • Документация: The if statement.

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

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

    Пример: считаем от 1 до 5.

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

    Бесконечный цикл и break

    Иногда бесконечный цикл делают намеренно и выходят из него по условию:

    Документация: The while statement.

    Цикл for: перебор элементов

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

    Пример со списком:

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

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

    Пример: вывести числа от 0 до 4.

    range(5) означает: сгенерировать последовательность 0, 1, 2, 3, 4.

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

  • range(stop)
  • range(start, stop)
  • range(start, stop, step)
  • Пример с шагом:

    Документация: The for statement, range.

    !Иллюстрация, как for по очереди присваивает элементы коллекции переменной цикла

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

    break

    break полностью прекращает цикл.

    continue

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

    Документация: break and continue statements.

    else у циклов

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

    Пример: поиск числа.

    Полезное правило чтения: else здесь означает “не было досрочного выхода”.

    Заглушка pass

    Иногда нужно синтаксически создать блок, но пока не писать в нём код. Для этого используют pass.

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

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

    Этот пример объединяет while, if/elif/else, break, работу со строками и преобразования типов.

    Как писать понятные условия и циклы

    > "Readability counts." (PEP 20 — The Zen of Python)

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

  • Делайте условия короткими и читаемыми.
  • Если условие сложное, вынесите части в переменные:
  • Предпочитайте for перебору коллекций, а while используйте для повторения “пока”.
  • Что дальше

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

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

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

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

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

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

    Функции: что это и зачем нужны

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

    Функции полезны, когда:

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

    Функция объявляется ключевым словом def.

    Важно:

  • после имени функции идут скобки с параметрами;
  • тело функции — это блок с отступом;
  • функция начинает выполняться только при вызове.
  • Документация: def — function definitions.

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

    Термины, которые часто путают:

  • параметры — это имена в определении функции (name в примере выше);
  • аргументы — это конкретные значения при вызове ("Анна").
  • Возврат значения: return

    Чтобы функция не только печатала результат, но и возвращала его, используют return.

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

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

    return завершает функцию сразу.

    Виды аргументов: позиционные и именованные

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

    Порядок важен.

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

    Можно явно указать, какой параметр чему равен.

    Именованные аргументы повышают читаемость, особенно если параметров много.

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

    Иногда удобно сделать параметр необязательным.

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

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

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

    Правильный вариант:

    Функции с произвольным числом аргументов

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

  • *args собирает позиционные аргументы в кортеж tuple
  • **kwargs собирает именованные аргументы в словарь dict
  • Используйте это умеренно: для начинающих код с явными параметрами обычно понятнее.

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

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

    Докстринги помогают:

  • себе в будущем;
  • коллегам;
  • инструментам разработки.
  • Области видимости: где “живут” переменные

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

    Локальная область видимости

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

    Глобальная область видимости

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

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

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

    global разрешает присваивать значение глобальной переменной внутри функции.

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

  • global лучше избегать в большинстве проектов, потому что усложняет понимание кода.
  • вместо изменения глобального состояния чаще возвращают новое значение через return.
  • Вложенные функции и nonlocal

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

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

    !Наглядно показывает, в каком порядке Python ищет переменные

    Если хотите углубиться, полезный термин для поиска в документации — правило LEGB (Local, Enclosing, Global, Built-in).

    Модули: как разделять код по файлам

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

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

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

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

    Документация: math — Mathematical functions.

    Разные формы import

  • Импорт модуля целиком
  • Импорт конкретного имени
  • Псевдонимы через as
  • Документация: import system.

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

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

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

    Файл main.py:

    Так вы отделяете полезную функцию от пользовательского ввода и вывода.

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

    Пакет — это папка с модулями. Обычно она содержит файл __init__.py.

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

  • project/
  • project/app/
  • project/app/__init__.py
  • project/app/utils.py
  • project/main.py
  • Документация: Packages.

    __name__ == "__main__": как отличить запуск файла от импорта

    Когда вы запускаете файл напрямую, Python присваивает переменной __name__ значение "__main__".

    Это позволяет писать код, который:

  • выполняется при запуске файла;
  • не выполняется при импорте файла как модуля.
  • Пример utils.py:

    Если вы сделаете import utils, строка print(add(2, 3)) не выполнится.

    Документация: Special variables — __name__.

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

    Функции удобно комбинировать с условиями и циклами из прошлой статьи.

    Этот пример показывает типичный стиль:

  • “маленькие” функции делают одно действие;
  • main() управляет сценарием программы;
  • точка входа оформлена через __name__ == "__main__".
  • Рекомендации по стилю и именованию

    Чтобы код было проще читать и поддерживать:

  • называйте функции глаголами: read_int, normalize_name, calculate_total;
  • старайтесь, чтобы функция делала одну понятную задачу;
  • избегайте больших функций на десятки строк, если их можно разделить.
  • Общий стиль Python описан в рекомендации: PEP 8.

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

    Из первой статьи вы уже знаете про pip и виртуальные окружения. Когда вы начнёте подключать внешние библиотеки, вы будете:

  • устанавливать пакет в активированное venv;
  • импортировать его как модуль (import requests);
  • использовать его функции и классы так же, как вы используете свои модули.
  • Что дальше

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

  • создавать функции, передавать аргументы и возвращать значения;
  • понимать, почему переменная “не видна” вне функции, и как работает область видимости;
  • разделять проект на модули и правильно импортировать код;
  • делать аккуратную точку входа через __name__ == "__main__".
  • Дальше обычно переходят к более глубоким структурам данных и организации программ: работе со строками и файлами, обработке ошибок, а затем к объектно-ориентированному подходу и практическим мини-проектам.

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

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

    В прошлых статьях вы уже встречали коллекции: list, tuple, set, dict. Сейчас разберём их системно: чем они отличаются, как их создавать, как получать и изменять элементы, какие операции удобны для разных задач.

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

    Официальная справка по встроенным типам: Built-in Types.

    Общие идеи: что важно понимать про коллекции

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

  • Упорядоченность: есть ли у элементов фиксированный порядок.
  • Изменяемость: можно ли менять коллекцию после создания.
  • Уникальность: допускаются ли повторы.
  • Способ доступа: по индексу (как у списка) или по ключу (как у словаря).
  • !Сводное сравнение основных коллекций Python

    Списки list

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

    Документация: Sequence Types — list.

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

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

    Индекс — это номер элемента, начиная с 0.

    Срез — это получение части списка.

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

    Частые методы списка

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

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

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

    Чтобы сделать копию:

    Кортежи tuple

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

    Документация: Sequence Types — tuple.

    Создание кортежа

    Кортеж поддерживает индексацию и срезы так же, как список:

    Что значит «неизменяемый»

    Нельзя заменить элемент:

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

    Множества set

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

  • убрать повторы
  • быстро проверять принадлежность элемента через in
  • находить пересечения и различия наборов
  • Документация: Set Types — set.

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

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

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

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

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

    Что можно хранить в set

    Элементы множества должны быть хешируемыми (проще: неизменяемыми с точки зрения Python). Обычно можно:

  • числа, строки
  • кортежи (если внутри тоже хранятся хешируемые значения)
  • Нельзя хранить в set список или словарь:

    Словари dict

    Словарь — коллекция вида ключ → значение. Подходит, когда нужно быстро находить данные по «имени» (ключу): телефон по контакту, цену по названию товара, настройки по параметрам.

    Документация: Mapping Types — dict.

    Создание словаря

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

    Через []:

    Если ключа нет, будет ошибка KeyError. Для безопасного доступа используйте get():

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

    Удаление

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

    В циклах for (из прошлой статьи) словарь можно перебирать несколькими способами:

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

    Ключи должны быть уникальными и хешируемыми. На практике чаще всего ключи — строки.

    Полезные операции, которые работают почти везде

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

    Преобразования между коллекциями

    Иногда нужно сменить тип коллекции под задачу.

    Важно помнить: при преобразовании в set порядок не сохраняется.

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

    Задача: пользователь вводит строку, а программа считает, сколько раз встречается каждое слово.

    Идея:

  • разбить строку на слова
  • пройти циклом по словам
  • хранить счётчик в dict по ключу-слову
  • Здесь связываются сразу несколько тем курса:

  • input() и строки
  • цикл for
  • словарь dict и метод get()
  • понятная структура кода (дальше это можно вынести в функцию)
  • Как выбрать правильную коллекцию

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

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

  • Путать {} и set()
  • {} это пустой dict, а пустое множество — set()
  • Ожидать «стабильного порядка» от set
  • множество не предназначено для хранения в порядке
  • Получать значение из словаря через [], когда ключ может отсутствовать
  • используйте get() или проверку if key in d:
  • Создавать «копию» списка через простое присваивание
  • если нужна копия, используйте copy() или срез [:]
  • Что дальше

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

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

    6. Файлы, исключения и основы работы с данными

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

    Программы становятся по-настоящему полезными, когда умеют:

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

    !Общая схема: как данные проходят путь от файла к структурам Python, обработке и записи результата

    Пути и файлы

    Файл на диске определяется путём.

  • Абсолютный путь начинается от корня диска или системы
  • Относительный путь считается от текущей рабочей папки, из которой вы запускаете программу
  • Чтобы работать с путями аккуратно и кроссплатформенно, удобно использовать модуль pathlib из стандартной библиотеки: pathlib — Object-oriented filesystem paths.

    Пример:

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

  • храните входные данные рядом с проектом (например, в папке data/)
  • используйте Path вместо ручной склейки строк через +
  • Открытие файлов: open() и менеджер контекста with

    Основная функция для работы с файлами: open(). Документация: open, а также раздел учебника Reading and Writing Files.

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

    Ключевая идея:

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

    Режим задаётся вторым аргументом в open(path, mode, ...).

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

    Чаще всего для текстовых данных вам нужны "r", "w", "a".

    Кодировка

    Для текста указывайте encoding="utf-8".

  • без encoding кодировка может зависеть от системы
  • utf-8 упрощает обмен файлами между компьютерами
  • Чтение из файла

    Прочитать весь файл целиком

    Подходит для небольших файлов. Для больших файлов лучше читать построчно.

    Читать построчно

    Полезные детали:

  • строка из файла обычно содержит символ перевода строки "\n" в конце
  • rstrip("\n") убирает только перевод строки справа
  • Превратить строки в данные

    Например, файл numbers.txt содержит числа по одному в строке:

    Здесь связались темы курса:

  • цикл for
  • список list
  • преобразование типов через int()
  • Запись в файл

    Записать строку или текст

    Важно:

  • write() не добавляет "\n" автоматически
  • режим "w" перезаписывает файл
  • Дозапись в конец файла

    Запись через print()

    print() можно направить в файл параметром file=:

    Плюс такого подхода: print() сам добавляет перевод строки.

    Исключения: что это такое и зачем они нужны

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

    Примеры типичных исключений:

  • FileNotFoundError — файл не найден
  • PermissionError — нет прав на чтение или запись
  • ValueError — невозможно преобразовать значение (например, int("abc"))
  • KeyError — ключ не найден в словаре при доступе через []
  • Официальный учебник: Errors and Exceptions, справочник: Built-in Exceptions.

    Базовый шаблон try / except

    Правило хорошего стиля:

  • ловите конкретные исключения, а не “всё подряд”, чтобы не скрывать реальные ошибки
  • else и finally

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

    Когда использовать raise

    Иногда ошибка должна быть “официально” сообщена вызывающему коду. Для этого используют raise.

    Этот подход хорошо сочетается с функциями из прошлой темы:

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

    Файлы часто содержат не просто текст, а структурированные данные. Для начала достаточно двух форматов:

  • JSON для вложенных структур (dict, list)
  • CSV для таблиц (строки и столбцы)
  • JSON: сохранить и загрузить dict и list

    Документация: json — JSON encoder and decoder.

    Пример структуры данных:

    Запись в JSON-файл:

    Параметры:

  • ensure_ascii=False позволяет сохранять русские буквы как есть
  • indent=2 делает файл читаемым для человека
  • Чтение JSON-файла:

    CSV: табличные данные

    Документация: csv — CSV File Reading and Writing.

    CSV обычно выглядит так:

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

    Здесь:

  • DictReader берёт заголовки и делает строки вида dict
  • newline="" рекомендуется модулем csv, чтобы корректно обрабатывать переводы строк на разных ОС
  • Запись CSV:

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

    Задача:

  • есть файл scores.txt, в каждой строке число
  • нужно игнорировать пустые строки
  • нужно собрать статистику и сохранить её в result.json
  • Решение с использованием функций:

    Что важно в этом примере:

  • чтение вынесено в функцию read_int_lines, чтобы код был переиспользуемым
  • расчёт статистики отделён в calc_stats
  • try/except стоит вокруг “опасных” операций, где возможны реальные ошибки
  • результат сохраняется в JSON, потому что это удобно для дальнейшей обработки
  • Как аккуратно организовать код в проекте

    Если логики ввода-вывода становится больше, удобно выделить модуль, например io_utils.py:

  • io_utils.py содержит функции чтения и записи
  • main.py содержит сценарий программы и пользовательское взаимодействие
  • Так вы применяете идеи из темы про модули и получаете более чистую структуру.

    Что дальше

    Теперь у вас есть практический набор инструментов:

  • чтение и запись файлов через with open(...)
  • понимание режимов открытия и кодировок
  • обработка ошибок через try/except/else/finally
  • работа с данными в форматах JSON и CSV
  • На этой базе удобно строить реальные мини-проекты: анализ текстов, простые отчёты, обработку логов, экспорт результатов, а позже и работу с сетевыми запросами и базами данных.

    7. ООП в Python и основы тестирования кода

    ООП в Python и основы тестирования кода

    В прошлых темах вы научились писать программы с условиями, циклами, функциями, модулями, коллекциями, файлами и исключениями. Следующий шаг к более крупным и поддерживаемым проектам — освоить объектно-ориентированное программирование (ООП) и базовые подходы к тестированию кода.

    ООП помогает:

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

  • проверять, что код работает правильно после изменений
  • быстрее находить ошибки
  • повышать уверенность при рефакторинге
  • Что такое ООП: классы и объекты

    Класс — это “шаблон” (описание) того, как устроены объекты.

    Объект — конкретный экземпляр класса, созданный по шаблону.

    Простой пример: класс User описывает, что у пользователя есть имя и возраст, и что он умеет делать (например, здороваться). А user1 и user2 — конкретные пользователи.

    !Наглядная связь между классом и объектами

    Документация: Учебник Python — Classes.

    Как объявлять класс и создавать объект

    Минимальный класс:

    Здесь:

  • class User: объявляет класс
  • User() создаёт объект (экземпляр)
  • Атрибуты и методы

    Атрибуты — данные объекта (например, name).

    Методы — функции, “принадлежащие” классу (например, greet).

    Конструктор __init__

    __init__ вызывается при создании объекта и обычно задаёт начальные значения.

    Важные идеи:

  • self — ссылка на текущий объект
  • self.name и self.age — атрибуты объекта
  • метод greet использует данные объекта
  • Инкапсуляция: прятать сложность за интерфейсом

    Один из практических смыслов ООП: объект предоставляет понятные методы, а детали реализации можно менять без переписывания всего проекта.

    Например, вместо того чтобы снаружи постоянно писать age >= 18, можно сделать метод:

    Теперь внешний код проще читать:

    “Приватные” атрибуты по соглашению

    В Python часто используют соглашение:

  • атрибуты, начинающиеся с _, считаются “внутренними”
  • Смысл: внешний код не должен напрямую менять _balance, а должен использовать методы.

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

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

    Здесь:

  • @property делает метод “чтением атрибута”
  • @price.setter добавляет проверку при присваивании
  • Документация: Built-in functions — property.

    Наследование: расширяем поведение

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

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

    Идея: Admin наследует всё от User, но переопределяет нужные методы.

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

  • наследование полезно, но не нужно применять “на всякий случай”
  • часто композиция (объект содержит другой объект) проще и безопаснее
  • Полиморфизм: одинаковый интерфейс, разные реализации

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

    Например, мы хотим “отправить уведомление”, и нам не важно, это email или SMS, если у обоих есть метод send.

    Здесь функция notify не проверяет тип, ей важен интерфейс.

    Магические методы: делаем объекты удобными

    У классов есть специальные методы вида __something__. Они позволяют вашим объектам вести себя “как встроенные”.

    Самые полезные на старте:

  • __str__ — человекочитаемая строка
  • __repr__ — строка для разработчика
  • __len__ — длина
  • __eq__ — сравнение
  • Пример:

    Документация: Data model — Special method names.

    dataclasses: меньше шаблонного кода

    Во многих задачах вам нужен класс, который в основном хранит данные. Для этого есть dataclasses.

    Что даёт @dataclass:

  • автоматически создаёт __init__
  • делает удобный __repr__
  • упрощает классы-структуры
  • Документация: dataclasses — Data Classes.

    Как связать ООП с темами курса

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

    Пример идеи проекта (без полного кода):

  • класс TodoItem хранит задачу
  • класс TodoList управляет списком задач (добавление, удаление, поиск)
  • модуль storage.py отвечает за сохранение и загрузку задач в JSON
  • модуль main.py содержит консольное меню
  • Такой проект использует:

  • коллекции (list, dict)
  • файлы и JSON
  • исключения (ValueError, FileNotFoundError)
  • функции и модули
  • классы для структуры
  • Зачем нужно тестирование

    Тесты — это код, который проверяет ваш код.

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

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

    Что такое юнит-тест

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

    Хороший юнит-тест обычно:

  • быстро выполняется
  • не зависит от сети
  • минимально зависит от файловой системы
  • проверяет один конкретный сценарий
  • assert: базовая проверка результата

    В Python есть оператор assert. Он удобен для быстрых проверок.

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

    Тестирование со стандартной библиотекой unittest

    unittest — встроенный модуль Python для модульного тестирования.

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

    Минимальная структура

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

  • calc.py
  • test_calc.py
  • calc.py:

    test_calc.py:

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

  • TestDiv — класс тестов
  • методы, начинающиеся с test_, являются тестами
  • assertEqual сравнивает ожидаемое и фактическое значение
  • assertRaises проверяет, что выбрасывается нужное исключение
  • Как запускать

    Часто запускают так:

    Или конкретный файл:

    Тестирование методов классов

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

    account.py:

    test_account.py:

    Здесь мы проверяем два важных сценария:

  • корректное изменение состояния объекта
  • корректную реакцию на неверные данные через исключение
  • Паттерн AAA: Arrange, Act, Assert

    Чтобы тесты читались проще, удобно мыслить шагами:

  • Arrange — подготовить данные и объекты
  • Act — выполнить действие
  • Assert — проверить результат
  • В примере с банковским счётом:

  • Arrange: acc = BankAccount(balance=10)
  • Act: acc.deposit(5)
  • Assert: self.assertEqual(...)
  • Что тестировать в первую очередь

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

  • функции и методы, где есть условия и ветвления if/elif/else
  • преобразование входных данных (например, строки в числа)
  • обработку ошибок и исключений
  • логику работы с коллекциями (поиск, фильтрация, подсчёт)
  • Типичные ошибки новичков в ООП и тестировании

  • Писать слишком “общие” классы
  • Лучше несколько маленьких классов с ясной ответственностью, чем один “комбайн”.
  • Дублировать логику в разных местах
  • Выносите повторяющееся поведение в методы или отдельные функции.
  • Смешивать ввод/вывод и логику
  • Тестировать проще, если “чистая логика” отделена от input() и print().
  • Тестировать только “счастливый путь”
  • Обязательно тестируйте неверные данные и исключения.
  • Что дальше

    Теперь у вас есть две важные опоры для роста проектов:

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