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

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

1. Введение: установка Python и первая программа

Введение: установка Python и первая программа

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

Что понадобится

  • Компьютер на Windows, macOS или Linux
  • Доступ в интернет для установки
  • 15–30 минут времени
  • Установка Python

    Мы будем использовать Python 3. Если где-то встречается выбор между Python 2 и Python 3 — всегда выбирайте Python 3.

    Windows

  • Откройте страницу загрузки: Python Downloads
  • Нажмите Download Python 3.x.x (версия может отличаться).
  • Запустите установщик.
  • Важно: поставьте галочку Add python.exe to PATH.
  • Нажмите Install Now и дождитесь завершения.
  • macOS

  • Откройте страницу загрузки: Python Downloads
  • Скачайте установщик для macOS.
  • Запустите .pkg-файл и пройдите шаги установки.
  • Примечание: в macOS может быть предустановлен Python, но нам нужен актуальный Python 3 с сайта python.org.

    Linux

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

  • Для Ubuntu/Debian часто подходят пакеты python3 и python3-pip
  • Если вы не уверены, установлен ли Python, сначала выполните проверку версии из следующего раздела.

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

    Откройте терминал:

  • Windows: PowerShell или Командная строка
  • macOS: Terminal
  • Linux: ваш терминал
  • Введите команду проверки версии:

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

    Вы должны увидеть что-то вроде Python 3.12.1. Главное, чтобы версия начиналась с 3.

    Если на Windows вы видите сообщение, что команда не найдена, чаще всего это значит, что Python не добавился в PATH. В таком случае переустановите Python и убедитесь, что галочка Add python.exe to PATH включена.

    Где писать код

    Есть два простых варианта для старта:

  • IDLE — простой редактор, который обычно ставится вместе с Python
  • Visual Studio Code — удобный редактор для работы над проектами
  • Ссылки:

  • Visual Studio Code
  • Python extension for Visual Studio Code
  • На первых шагах можно использовать IDLE, а позже перейти на VS Code.

    Первая программа: Hello, World!

    Вариант через файл .py

  • Создайте папку, например python-course.
  • Создайте в ней файл hello.py.
  • Откройте файл в редакторе и напишите:
  • Запустите программу из терминала, находясь в папке с файлом.
  • Для Windows чаще всего:

    Для macOS/Linux часто:

    Вы увидите вывод:

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

  • print(...) — команда, которая выводит текст на экран
  • "Hello, World!" — это строка, то есть текст в кавычках
  • файл с расширением .py — это файл с программой на Python
  • Как устроена работа с программой

    Обычно цикл такой:

  • Написали код в файле .py
  • Сохранили файл
  • Запустили командой python имя_файла.py
  • Посмотрели результат или ошибку
  • Исправили и повторили
  • !Схема показывает типичный цикл: написать код → запустить → увидеть результат → исправить.

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

  • Команда python не найдена: Python не установлен или не добавлен в PATH (на Windows часто решается переустановкой с галочкой PATH).
  • Запускается не Python 3: попробуйте python3 вместо python.
  • Опечатка в имени файла: убедитесь, что файл называется ровно hello.py, а не hello.py.txt.
  • Запуск не из той папки: сначала перейдите в нужную папку командой cd.
  • Что дальше по курсу

    Дальше вы научитесь:

  • работать с переменными и типами данных
  • писать условия и циклы
  • создавать функции
  • собирать первые маленькие проекты
  • 2. Переменные, типы данных и операции

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

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

    Переменные

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

    Пример:

  • age и name — имена переменных
  • =оператор присваивания (положить значение в переменную)
  • 20 и "Аня" — значения
  • Важно: = в программировании — это не “равно” из математики. Это команда: сохранить значение справа под именем слева.

    !Переменная как имя, которое указывает на значение

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

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

    Типы данных

    Тип данных — это “вид” значения. Тип определяет, какие операции допустимы и как ведёт себя значение.

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

    | Тип | Как выглядит | Пример | Для чего подходит | |---|---|---|---| | int (целое число) | без точки | 10, -3 | счётчики, количество, возраст | | float (вещественное число) | с точкой | 3.14, 0.5 | измерения, проценты, средние значения | | str (строка) | в кавычках | "Привет", 'OK' | текст, сообщения, имена | | bool (логический тип) | True или False | True | проверки “да/нет” | | NoneType | значение None | None | “пока нет значения”, “неизвестно” |

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

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

    Документация по type() (если захотите заглянуть позже): Built-in Functions — type

    Операции с числами

    Арифметика

    Деление без дробной части и остаток

    Иногда нужно получить целую часть или остаток:

  • // удобно, когда нужно “сколько раз помещается”
  • % полезен для проверки чётности: число чётное, если n % 2 == 0
  • Возведение в степень

    Порядок вычислений

    Python считает почти так же, как в обычной арифметике:

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

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

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

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

    Длина строки

    Документация по типам и операциям со строками: Standard Types — str

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

    Сравнение

    Результат сравнения — это True или False.

    Частая ошибка новичков: не путайте = и ==.

  • = присваивает
  • == сравнивает
  • Логические операторы

  • and — “и” (истина, если истинны обе части)
  • or — “или” (истина, если истинна хотя бы одна часть)
  • not — “не” (переворачивает значение)
  • Преобразование типов

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

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

    Важно: не любую строку можно превратить в число. Например, int("hello") вызовет ошибку.

    Мини-практика: маленький калькулятор без ввода

    Соберём простую программу, где есть переменные, типы и операции:

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

  • Пишут 2 + "2" и ждут 4.
  • - Это разные типы (int и str). Нужно либо 2 + int("2"), либо str(2) + "2".
  • Путают = и ==.
  • Забывают кавычки у строк: нужно "Привет", а не Привет.
  • Что дальше

    Переменные и операции — это “кирпичики” программ. В следующих уроках вы начнёте управлять логикой программы: делать ветвления (условия) и повторять действия (циклы), используя bool, сравнения и выражения, которые вы узнали здесь.

    3. Условия и циклы: управление логикой программы

    Условия и циклы: управление логикой программы

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

    Условия: как программа принимает решения

    Условие — это проверка, результат которой всегда True или False. Обычно условие строится из сравнений (>, == и т. д.) и логических операторов (and, or, not), которые вы уже видели в теме про тип bool.

    Конструкция if

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

    Что важно:

  • if читается как “если”.
  • После условия ставится двоеточие :.
  • Следующие строки идут с отступом (обычно 4 пробела) — это тело блока, то есть код, который выполнится, если условие истинно.
  • !Блок-схема показывает, что код внутри if выполняется только при True.

    else: что делать иначе

    Если нужно обработать оба случая:

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

    Когда вариантов больше двух, используйте elif (“иначе если”):

    Правила чтения:

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

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

    Неправильно (нет отступа, будет ошибка):

    Правильно:

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

    Сравнения возвращают True или False.

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

    Частая ошибка: путать = и ==.

  • = присваивает значение переменной.
  • == сравнивает два значения.
  • Логические операторы в условиях

  • and — истина, если истинны обе части.
  • or — истина, если истинна хотя бы одна часть.
  • not — “переворачивает” True и False.
  • Пример: доступ есть, если возраст 18+ и есть билет.

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

    Полезный приём: проверка диапазона

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

    Это читается как “температура от 18 до 26 включительно”.

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

    Цикл — это конструкция, которая повторяет блок кода много раз.

    В Python на старте важны два вида циклов:

  • while — повторять, пока условие истинно.
  • for — повторять для каждого значения из последовательности (для начала чаще всего из range()).
  • Цикл while

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

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

    Здесь:

  • i = 1 — начальное значение счётчика.
  • условие i <= 5 определяет, продолжать цикл или остановиться.
  • i = i + 1 — шаг, чтобы цикл когда-нибудь завершился.
  • !Схема показывает, что while повторяет блок, пока условие True.

    #### Бесконечный цикл — типичная ошибка

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

    Чтобы остановить зависшую программу в терминале, обычно используют Ctrl+C.

    Цикл for и функция range()

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

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

    Вывод будет:

    Если нужно считать “по-человечески” от 1:

    Форма range(start, stop) даёт числа от start до stop - 1.

    Можно задавать шаг step:

    Это напечатает чётные числа от 0 до 10.

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

    Иногда нужно вмешаться в “обычный” ход цикла.

    | Команда | Что делает | Когда полезно | |---|---|---| | break | прерывает цикл полностью | нашли ответ и дальше искать не нужно | | continue | пропускает текущую итерацию и идёт дальше | нужно игнорировать часть случаев |

    Пример с break: остановимся, когда нашли первое число, кратное 7.

    Пример с continue: печатаем числа от 1 до 10, но пропускаем чётные.

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

    Чтобы программа стала более “живой”, часто используют input() — она читает строку из ввода пользователя. В прошлом уроке вы уже изучили преобразование типов, поэтому важно помнить: input() всегда возвращает str.

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

    Если пользователь введёт не число (например, abc), int(text) вызовет ошибку. Обрабатывать такие ошибки мы научимся позже; пока вводите числа.

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

  • Забыли двоеточие : после if, elif, else, for, while.
  • Перемешали отступы пробелами и табами или сделали разный отступ внутри одного блока.
  • В while забыли изменить переменную, из-за чего цикл стал бесконечным.
  • Ожидали, что range(5) выдаст числа до 5 включительно.
  • Куда смотреть в документации

  • Python documentation: The if statement
  • Python documentation: The while statement
  • Python documentation: The for statement
  • Python documentation: range
  • Что дальше

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

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

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

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

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

    !Наглядное сравнение четырёх структур данных по ключевым свойствам

    Строки

    Строка (тип str) хранит текст: буквы, пробелы, символы, цифры как текст.

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

    Строку можно читать по символам через индекс. Индексация начинается с 0.

    Срез берёт часть строки.

    Важно: строка неизменяемая.

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

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

  • Склеивание: "a" + "b"
  • Повторение: "ha" * 3
  • Длина: len(text)
  • Проверка вхождения: "a" in text
  • Часто используемые методы строк

    Методы вызываются через точку: строка.метод(...).

    | Метод | Что делает | Пример | |---|---|---| | lower() | делает буквы маленькими | "Py".lower()"py" | | upper() | делает буквы большими | "Py".upper()"PY" | | strip() | убирает пробелы по краям | " hi ".strip()"hi" | | replace(a, b) | заменяет подстроки | "a-b".replace("-", ":")"a:b" | | split() | разбивает строку на список | "a b".split()["a", "b"] |

    Документация: Строки в Python (str)

    Списки

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

    Индексация, срезы, изменение элементов

    Как и у строк, индексация начинается с 0.

    В отличие от строк, список изменяемый.

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

    | Метод | Что делает | Пример | |---|---|---| | append(x) | добавляет в конец | a.append(5) | | extend(xs) | добавляет все элементы из другой коллекции | a.extend([1, 2]) | | insert(i, x) | вставляет по индексу | a.insert(0, "hi") | | pop() / pop(i) | удаляет и возвращает элемент | a.pop() | | remove(x) | удаляет первое вхождение значения | a.remove(10) |

    Перебор списка в цикле

    Самый частый вариант:

    Иногда нужен индекс:

    Документация: Встроенный тип list

    Словари

    Словарь (тип dict) хранит пары ключ → значение. Это удобно, когда вы хотите быстро получать значение по "имени".

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

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

    Если обратиться к ключу, которого нет, будет ошибка. Более безопасно использовать get().

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

    По умолчанию цикл for идёт по ключам:

    Часто удобнее items():

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

    Документация: Встроенный тип dict

    Множества

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

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

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

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

    Документация: Встроенный тип set

    Как выбрать структуру данных

    | Нужно | Обычно подходит | |---|---| | хранить текст | str | | хранить упорядоченный набор и менять его | list | | хранить данные "по полям" и быстро брать по ключу | dict | | хранить уникальные значения и быстро проверять наличие | set |

    Небольшой пример: учёт покупок

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

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

  • Путают индексы: первый элемент всегда 0, последний можно брать через -1.
  • Забывают, что input() возвращает строку: для чисел нужен int(...) или float(...).
  • Думают, что set сохраняет порядок элементов.
  • Создают пустое множество как {} и получают dict.
  • Что дальше

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

    5. Функции, модули и работа с файлами

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

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

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

    !Три ключевые темы урока и как они связаны

    Функции

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

  • не копировать один и тот же код
  • делать программу понятнее (по имени функции видно, что она делает)
  • тестировать и улучшать части программы отдельно
  • Документация: Определение функций (Python)

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

    Минимальный шаблон:

    Здесь:

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

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

    Параметр name становится переменной внутри функции.

    return: как вернуть результат

    print() выводит на экран, но не возвращает значение наружу. Чтобы вернуть результат, используют return.

    Важно:

  • return завершает выполнение функции
  • если return не написан, функция возвращает None
  • Ранний выход из функции

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

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

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

    Область видимости: что видно внутри и снаружи

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

    Это полезно: функции не “засоряют” программу лишними переменными и меньше мешают друг другу.

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

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

    Модули

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

    Модуль — это обычный файл .py, который можно подключать через import.

    Документация: Модули (Python)

    Импорт модулей из стандартной библиотеки

    Пример с модулем math:

    Иногда удобно импортировать конкретные имена:

    Можно использовать псевдоним:

    Как сделать свой модуль

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

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

    Файл main.py:

    Правило простое: Python ищет utils.py рядом с main.py (в текущей папке проекта) и подключает его.

    __name__ == "__main__": почему иногда код “сам запускается”

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

    Это позволяет:

  • импортировать функции из файла без побочных эффектов
  • запускать файл как программу, если нужно
  • !Пояснение, когда выполняется блок if __name__ == "__main__"

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

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

    Главная функция для работы с файлами — open().

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

    Как читать файл

    Допустим, есть файл notes.txt.

    Параметры:

  • "notes.txt" — имя файла (путь)
  • режим "r" — чтение (read)
  • encoding="utf-8" — правильная кодировка для русского текста
  • Почему важно закрывать файл и как делать это правильно

    Закрывать файл важно, чтобы:

  • данные точно записались на диск
  • не держались лишние системные ресурсы
  • Лучший способ — контекстный менеджер with: он сам закроет файл.

    Документация: Контекстные менеджеры и with

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

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

    strip() убирает пробелы и перенос строки по краям.

    Как записывать в файл

    Режимы записи:

  • "w" — записать заново (старое содержимое будет удалено)
  • "a" — дописать в конец (append)
  • Запись заново:

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

    Частые ошибки при работе с файлами

  • Файл не найден: вы запускаете программу не из той папки или неверно указали путь.
  • Неправильная кодировка: для русского текста почти всегда используйте encoding="utf-8".
  • Случайно стёрли файл: режим "w" перезаписывает файл целиком.
  • Мини-проект: список дел с сохранением в файл

    Соберём простую программу, которая:

  • загружает дела из tasks.txt, если файл существует
  • позволяет добавить новое дело
  • сохраняет обновлённый список
  • Что здесь важно из прошлых уроков:

  • список tasks — это list
  • условия if решают, добавлять ли задачу
  • цикл for печатает задачи
  • функция enumerate() даёт номер элемента (индексацию “по-человечески”)
  • Документация: enumerate

    Что дальше

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

  • писать функции с параметрами и return
  • выносить код в модули и подключать его через import
  • читать и записывать текстовые файлы безопасно через with open(...)
  • Следующий логичный шаг в курсе — тренироваться собирать первые проекты: небольшие утилиты, обработка текста, простые консольные приложения, где функции и файлы дают реальную пользу.

    6. Ошибки и отладка: исключения и тестирование

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

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

    Какие бывают ошибки

    В учебных проектах чаще всего встречаются три категории.

  • Синтаксические ошибки: Python не понимает код и даже не запускает программу.
  • Исключения во время выполнения: программа запустилась, но в процессе что-то пошло не так.
  • Логические ошибки: программа работает без падений, но результат неправильный.
  • Синтаксическая ошибка

    Пример: забыли двоеточие после if.

    Python покажет SyntaxError и укажет место, где он перестал понимать программу.

    Исключение во время выполнения

    Пример: деление на ноль.

    Это вызовет ZeroDivisionError.

    Логическая ошибка

    Пример: формула написана неверно, но ошибок нет.

    Такую ошибку Python не распознает автоматически: здесь помогают отладка и тестирование.

    Как читать traceback

    Когда возникает исключение, Python печатает traceback — “след вызовов”, то есть список мест, через которые программа пришла к ошибке.

    Обычно полезно читать traceback снизу вверх.

  • В самой нижней строке указан тип исключения и сообщение.
  • Строки выше показывают, в каких файлах и на каких строках происходили вызовы функций.
  • Документация: Ошибки и исключения

    !Визуальная подсказка, что главное в traceback находится внизу, а выше — путь вызовов

    Исключения: что это такое

    Исключение — это специальный объект, который сообщает: “произошла ошибка, дальше обычным способом продолжать нельзя”.

    Python поднимает исключения автоматически (например, ValueError, TypeError, FileNotFoundError), а вы можете:

  • обработать их через try/except
  • поднять сами через raise
  • Обработка исключений: try/except

    Базовая конструкция:

    Как это работает:

  • Код в try выполняется обычно.
  • Если внутри try случается исключение указанного типа, выполняется соответствующий except.
  • Если случилось другое исключение, которого нет в except, программа завершится, и вы увидите traceback.
  • except для нескольких типов

    Иногда одинаковая реакция нужна на несколько ошибок.

    else и finally

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

    Когда не стоит ловить исключения

    Ловить всё подряд через except Exception: опасно: можно спрятать реальную проблему.

    Плохая идея:

    Лучше ловить конкретные ошибки, которые вы ожидаете в этом месте.

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

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

    Это превращает “тихую” ошибку в понятный, управляемый сценарий.

    Документация: Оператор raise

    Отладка: как искать причину

    Приём print-отладки

    Самый простой способ — временно вывести значения переменных.

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

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

    В Python можно поставить точку остановки через breakpoint().

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

    Документация: pdb — Python Debugger

    Тестирование: как проверять код автоматически

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

    Тесты полезны, когда:

  • вы изменяете код и боитесь “сломать” старое поведение
  • у функции много вариантов входных данных
  • вы хотите быстрее находить логические ошибки
  • Идея unit-теста

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

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

    Мы хотим проверить хотя бы пару случаев: 2 должен быть True, 3 должен быть False.

    unittest: стандартная библиотека для тестов

    Python содержит модуль unittest.

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

    Пример: функция и тесты

    Файл calc.py:

    Файл test_calc.py:

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

  • TestCalc — класс с тестами.
  • Методы, которые начинаются с test_, будут запускаться как тесты.
  • assertEqual(a, b) проверяет равенство.
  • assertRaises(...) проверяет, что вызов должен завершиться исключением.
  • Как запускать тесты

    Варианты запуска.

  • Запуск файла напрямую:
  • Запуск через модуль unittest:
  • Чтобы python -m unittest нашёл тесты автоматически, файлы тестов обычно называют test_*.py.

    Как связать это с проектами курса

    В прошлой статье вы делали мини-проект со списком дел и файлами. Теперь вы можете улучшить его:

  • использовать try/except, чтобы не падать при неправильном вводе пользователя
  • писать функции для загрузки и сохранения, а затем проверять их тестами
  • ловить FileNotFoundError при чтении файла и возвращать пустой список (вы уже видели этот приём)
  • Что дальше

    Теперь у вас есть два “страховочных троса” программиста:

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

    7. ООП и мини-проекты: закрепление навыков

    ООП и мини-проекты: закрепление навыков

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

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

    Что такое ООП простыми словами

    ООП — это подход, где программу удобно представлять как набор объектов.

  • Класс — “чертёж” (описание), по которому создаются объекты.
  • Объект — конкретный экземпляр класса.
  • Атрибут — данные объекта (например, имя, цена, статус).
  • Метод — функция, “принадлежащая” объекту (она работает с его данными).
  • !Схема показывает разницу между классом и объектами

    Документация: Классы в Python

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

    Создадим класс User, который хранит имя и умеет здороваться.

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

  • class User: — объявляем класс.
  • __init__конструктор: вызывается при создании объекта.
  • self — ссылка на текущий объект (поэтому у разных объектов свои данные).
  • self.name — атрибут объекта.
  • greet() — метод объекта.
  • Зачем нужен self

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

    Инкапсуляция: прячем детали и защищаем состояние

    Инкапсуляция — идея, что у объекта есть “внутреннее состояние”, и менять его нужно безопасно.

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

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

    Здесь мы используем навыки из прошлых уроков:

  • проверки через if
  • исключения через raise ValueError(...)
  • работу с числами и переменными
  • Наследование: расширяем поведение

    Наследование — когда один класс берёт поведение другого и дополняет его.

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

    Когда использовать наследование:

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

    Композиция: класс содержит другие объекты

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

    Пример: TaskManager содержит список задач.

    !Схема показывает композицию: менеджер задач хранит задачи

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

    Мини-проект: менеджер задач на ООП с сохранением в файл

    Соберём консольную программу, которая:

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

    Документация: Модуль json

    Шаг 1. Класс Task

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

  • mark_done() меняет состояние задачи
  • to_dict() превращает объект в словарь (так проще сохранить в JSON)
  • from_dict(...) делает задачу обратно из словаря
  • Шаг 2. Класс TaskManager

    Какие навыки здесь закрепляются:

  • файлы: with open(...)
  • исключения: FileNotFoundError, ValueError, IndexError
  • структуры данных: списки и словари
  • функции/методы: разнесение логики по небольшим действиям
  • Шаг 3. Консольный интерфейс

    Как тестировать код с ООП

    Проверять удобнее всего не консольный ввод/вывод, а “ядро”: методы классов.

    Пример тестов для BankAccount с unittest.

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

    Идеи мини-проектов для закрепления

  • Учёт расходов
  • - классы: Expense, Budget - сохранение: JSON-файл - полезные темы: списки, суммы, фильтрация по категориям
  • Контакты
  • - классы: Contact, PhoneBook - поиск по имени, удаление - обработка ошибок ввода
  • Мини-викторина
  • - классы: Question, Quiz - случайный порядок вопросов - подсчёт результата

    Что вы должны унести из урока

  • ООП помогает структурировать код: данные и действия рядом.
  • Основной набор ООП для старта:
  • - класс, объект, атрибут, метод - __init__, self - инкапсуляция через “внутренние” поля и методы - наследование и композиция
  • Мини-проекты лучше строить вокруг:
  • - данных (что храните) - действий (что пользователь делает) - хранения (файл) - устойчивости (исключения) - проверяемости (тесты)