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

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

1. Старт: установка, запуск кода и основы синтаксиса Python

Старт: установка, запуск кода и основы синтаксиса Python

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

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

  • Установить Python и проверить, что он работает
  • Запускать код несколькими способами
  • Понимать базовый синтаксис: отступы, комментарии, переменные, простые операции
  • Читать сообщения об ошибках и исправлять типовые проблемы
  • Что такое Python и как он запускает код

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

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

    Установка Python

    Шаг 1. Скачайте Python

    Скачивайте Python с официального сайта:

  • Python Downloads
  • Рекомендуемая версия для обучения — актуальная стабильная Python 3.

    Шаг 2. Установите Python на вашу систему

    #### Windows

  • Запустите установщик.
  • Обязательно отметьте галочку Add Python to PATH (это позволит запускать python из командной строки).
  • Нажмите Install Now.
  • #### macOS

  • Скачайте установщик для macOS с сайта Python.
  • Установите как обычную программу.
  • Откройте приложение Terminal и проверьте версию (ниже).
  • #### Linux

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

    Шаг 3. Проверьте, что Python установлен

    Откройте терминал (или PowerShell на Windows) и выполните одну из команд:

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

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

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

  • Python не установлен
  • Python установлен, но не добавлен в PATH (на Windows это частый случай)
  • Как запускать Python-код

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

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

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

  • В терминале выполните:
  • Появится приглашение >>>. Попробуйте:
  • Чтобы выйти:

  • Windows: Ctrl + Z, затем Enter
  • macOS/Linux: Ctrl + D
  • Когда удобно:

  • Быстро проверить, как работает выражение
  • Поэкспериментировать с функциями
  • Запуск файла .py

    Это основной способ писать программы.

  • Создайте папку проекта, например python-start.
  • Внутри создайте файл main.py.
  • Запишите код:
  • Запустите из терминала, находясь в папке с файлом:
  • Если у вас срабатывает только python3:

    Запуск в редакторе кода (рекомендуется)

    Самый популярный бесплатный вариант — Visual Studio Code.

  • Установите редактор:
  • Visual Studio Code
  • Установите расширение Python:
  • Python extension for Visual Studio Code
  • Откройте папку проекта в VS Code.
  • Откройте main.py и запустите (обычно кнопкой Run).
  • Плюсы редактора:

  • Подсветка синтаксиса
  • Подсказки и автодополнение
  • Удобный запуск и просмотр ошибок
  • Основы синтаксиса Python

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

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

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

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

    Пример с условием:

    Важно:

  • После if стоит двоеточие :
  • Внутри блока строки с одинаковым отступом
  • Обычно используется 4 пробела
  • Типовая ошибка новичка — смешивать табы и пробелы или делать разные отступы.

    Комментарии

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

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

  • Пояснять сложные места
  • Оставлять заметки для себя
  • Переменные и имена

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

    Правила для имён:

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

    Самые частые типы на старте:

  • int — целые числа, например 10
  • float — числа с точкой, например 3.14
  • str — строки, например "Привет"
  • Примеры:

    Ввод и вывод

    Вывод на экран делается функцией print():

    Ввод с клавиатуры — input().

    Важно:

  • input() всегда возвращает строку
  • Если нужно число, строку надо преобразовать
  • Пример:

    Если пользователь введёт не число, возникнет ошибка — это нормально на старте, позже вы научитесь обрабатывать такие ситуации.

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

    Пример основных операторов:

  • + сложение (и склейка строк)
  • - вычитание
  • * умножение
  • / деление
  • Ошибки: как читать и что делать

    Ошибки в программировании — это часть процесса. Python обычно показывает:

  • тип ошибки
  • строку, где ошибка случилась
  • подсказку, что именно не так
  • Пример ошибки:

    Вы увидите сообщение, в котором будет NameError: это означает, что используется имя, которое не определено.

    Как действовать при ошибке:

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

    Пишите код маленькими шагами

  • Добавили 2–3 строки
  • Запустили
  • Убедились, что работает
  • Следуйте стилю

    У Python есть рекомендации по стилю кода. Полный документ большой, но полезно знать, что он существует:

  • PEP 8 — Style Guide for Python Code
  • На старте достаточно двух правил:

  • Делайте отступы 4 пробела
  • Давайте понятные имена переменным
  • Держите под рукой официальную документацию

  • The Python Tutorial
  • Эта документация пригодится на всём пути обучения.

    Итоги

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

  • Устанавливать Python и проверять версию
  • Запускать код в интерактивном режиме и из файла .py
  • Понимать базовый синтаксис: отступы, комментарии, переменные, ввод/вывод
  • Читать простые сообщения об ошибках
  • В следующей части курса логично перейти к управлению логикой программы: условиям, циклам и работе с несколькими действиями подряд.

    2. Типы данных, операторы, условия и циклы

    Типы данных, операторы, условия и циклы

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

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

    После этой статьи вы сможете:

  • Понимать основные типы данных Python и преобразовывать их
  • Использовать операторы: арифметические, сравнения и логические
  • Писать условия if/elif/else
  • Работать с циклами while и for, управлять циклом через break и continue
  • Типы данных: что хранится в переменных

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

    Базовые типы, которые нужны новичку

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

    Чтобы посмотреть тип значения, используйте type():

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

    Это ключевой момент из прошлого урока: даже если пользователь вводит 25, Python получает это как текст.

    Если нужно число, делайте преобразование:

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

    Часто используются:

  • int("123") превращает строку в целое число
  • float("3.14") превращает строку в число с точкой
  • str(10) превращает число в строку
  • Пример:

    Важно помнить:

  • int("12.5") вызовет ошибку, потому что строка не является целым числом
  • если пользователь введёт не число, будет ValueError (позже вы научитесь обрабатывать это)
  • Истинность и ложность (пригодится в условиях)

    В условиях Python ожидает значение типа bool. Но некоторые значения автоматически считаются “ложными”:

  • 0, 0.0
  • пустая строка ""
  • None
  • Пример:

    Операторы: как вычислять и сравнивать

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

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

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

    Обратите внимание на /: даже если делите два int, результат обычно float.

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

    Они возвращают True или False:

  • == равно
  • != не равно
  • <, <=, >, >=
  • Пример:

    Сравнения можно “цепочкой”:

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

    Их используют, чтобы объединять проверки.

  • A and B истинно, если истинны оба
  • A or B истинно, если истинно хотя бы одно
  • not A инвертирует значение
  • Пример:

    Важно: and и or работают с коротким замыканием.

  • в A and B, если A ложь, B не вычисляется
  • в A or B, если A истина, B не вычисляется
  • Это полезно, чтобы не делать лишние проверки.

    Присваивание и сокращённые формы

    Кроме обычного = есть удобные формы:

    in и is: два частых оператора

  • in проверяет, содержится ли элемент в последовательности (например, подстрока в строке)
  • is проверяет, один и тот же ли это объект в памяти (обычно новичку почти всегда нужен ==, а не is)
  • Условия: как программе принимать решения

    Условие в Python записывается через if, дополнительные ветки через elif, иначе через else.

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

    Правила:

  • после if и elif стоит выражение, которое даёт True/False
  • после условия обязательно двоеточие :
  • внутри блока отступ (обычно 4 пробела)
  • !Схема показывает, как программа выбирает одну из веток if/elif/else

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

  • Путают = и ==.
  • Забывают двоеточие :.
  • Делают неверные отступы.
  • Пример неправильного кода:

    Здесь должна быть проверка равенства ==, а не присваивание =.

    Пример с вводом пользователя

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

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

    Цикл while

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

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

    Пример бесконечного цикла (так делать не нужно):

    Цикл for и range()

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

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

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

    Если нужен шаг:

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

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

    Пример с continue:

    Типовой шаблон: накапливаем результат

    Сумма чисел от 1 до 5:

    Как соединить всё в одной маленькой программе

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

    В этой программе используются:

  • типы данных (int)
  • преобразование int(input(...))
  • условие if
  • цикл while
  • оператор break
  • сокращённое присваивание +=
  • Итоги

    Теперь вы знаете и умеете:

  • Различать основные типы данных: int, float, str, bool, None
  • Преобразовывать типы через int(), float(), str()
  • Пользоваться операторами арифметики, сравнения и логики
  • Писать ветвления if/elif/else
  • Использовать циклы while и for, управлять ими через break и continue
  • Полезные страницы документации для закрепления:

  • The Python Tutorial — Control Flow
  • Built-in Types
  • Built-in Functions
  • 3. Функции, модули и работа с файлами

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

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

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

  • Не повторять один и тот же код (для этого нужны функции)
  • Организовать проект по файлам (для этого нужны модули)
  • Сохранять результаты работы и читать данные извне (для этого нужна работа с файлами)
  • После этой статьи вы сможете:

  • Создавать функции с параметрами и возвращаемыми значениями
  • Понимать, что такое область видимости переменных
  • Импортировать модули и использовать стандартную библиотеку
  • Создавать свои модули
  • Читать и записывать текстовые файлы с помощью with open(...)
  • Функции

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

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

  • Сократить повторение кода
  • Сделать программу понятнее (код читается как набор шагов)
  • Проще тестировать и исправлять ошибки
  • Простейшая функция выглядит так:

    Здесь:

  • def — ключевое слово для создания функции
  • greet — имя функции
  • () — список параметров (пока пустой)
  • блок функции задаётся отступами
  • Параметры и аргументы

    Параметры — это переменные в определении функции. Аргументы — значения, которые вы передаёте при вызове.

    name — параметр, а "Аня" и "Миша" — аргументы.

    return: как функция возвращает результат

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

    Важно:

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

    Несколько return и ранний выход

    Часто удобно завершать функцию раньше, если условие не выполнено.

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

    Параметру можно задать значение по умолчанию. Тогда при вызове его можно не передавать.

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

    Python позволяет передавать аргументы по имени — это делает вызов понятнее.

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

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

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

    Важно:

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

    У функции может быть строка-описание — докстрока. Это полезно для чтения кода и подсказок в редакторах.

    Полезная документация:

  • Python Docs — Defining Functions
  • Модули

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

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

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

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

    Пример импорта стандартного модуля math:

    Можно импортировать конкретные объекты:

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

    Важно:

  • после import math имя math становится доступным в вашем файле
  • from math import sqrt добавляет имя sqrt напрямую
  • Полезная документация:

  • Python Docs — Modules
  • Стандартная библиотека: примеры полезных модулей

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

  • random — случайные числа
  • math — математические функции
  • datetime — даты и время
  • pathlib — удобная работа с путями
  • Пример со случайным выбором:

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

    Представим, что у вас есть проект с файлами:

  • main.py
  • utils.py
  • В utils.py:

    В main.py:

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

    __name__ == "__main__": чтобы файл мог быть и модулем, и программой

    Иногда удобно, чтобы файл можно было:

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

    Если файл импортируют, main() не запустится автоматически.

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

    Зачем нужны файлы

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

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

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

  • Python Docs — open()
  • !Схема показывает, что при использовании with файл автоматически закрывается после завершения блока

    Открытие файла через with

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

    Чтение всего файла как строки:

    Здесь:

  • "data.txt" — имя файла (если он рядом с .py)
  • "r" — режим чтения (от слова read)
  • encoding="utf-8" — правильная кодировка для кириллицы
  • f — переменная, через которую мы работаем с файлом
  • Режимы открытия файла

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

    Пример записи (перезапишет файл целиком):

    Пример добавления в конец:

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

    Если файл большой, часто читают построчно.

    Здесь strip() убирает пробелы и символ перевода строки по краям.

    Пример: читаем числа из файла и считаем сумму

    Пусть в numbers.txt лежит:

  • 10
  • 20
  • -5
  • Код:

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

  • цикл for
  • преобразование типов int(...)
  • continue для пропуска пустых строк
  • Пути к файлам и pathlib

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

    Плюсы:

  • удобное соединение частей пути через /
  • код чаще получается переносимым между Windows, macOS и Linux
  • Документация:

  • Python Docs — pathlib
  • Типовые ошибки при работе с файлами

  • FileNotFoundError — файла не существует или указан неверный путь
  • проблемы с кириллицей — забыли encoding="utf-8"
  • случайно перезаписали файл через режим "w"
  • Привычка, которая экономит время:

  • всегда сначала решайте, нужен ли "w" (перезапись) или безопаснее "a" (добавление)
  • Итоги

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

  • Создавать функции, передавать параметры и получать результат через return
  • Понимать, чем локальные переменные отличаются от глобальных
  • Подключать стандартные модули и писать свои
  • Читать и записывать текстовые файлы с with open(...)
  • Использовать pathlib для удобной работы с путями
  • Эти навыки — основа для первых проектов: калькуляторов, игр в консоли, мини-утилит, которые сохраняют результаты в файлы и переиспользуют код через модули.

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

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

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

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

    Коллекции нужны, когда данных становится больше одного значения:

  • список покупок из многих товаров
  • таблица оценок многих учеников
  • настройки по ключам
  • набор уникальных значений без повторов
  • После этой статьи вы сможете:

  • выбирать подходящую структуру данных под задачу
  • создавать и изменять списки, словари, множества и кортежи
  • перебирать коллекции в циклах
  • использовать типовые методы коллекций
  • понимать разницу между изменяемыми и неизменяемыми типами
  • !Схема сравнивает 4 основные коллекции Python по идее хранения данных

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

    В Python есть несколько базовых встроенных коллекций:

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

  • Изменяемый тип означает, что объект можно менять на месте после создания.
  • Неизменяемый тип означает, что после создания объект изменить нельзя, можно только создать новый.
  • Практически:

  • list, dict, set — изменяемые
  • tuple, str, int, float, bool — неизменяемые
  • Это влияет на то, как ведут себя переменные и копии коллекций.

    Списки list

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

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

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

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

    Индекс — это позиция элемента, начинается с нуля.

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

    Изменение элементов

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

    | Операция | Пример | Что делает | |---|---|---| | Добавить в конец | items.append(x) | добавляет один элемент | | Добавить несколько | items.extend([a, b]) | добавляет элементы из другой коллекции | | Вставить по индексу | items.insert(i, x) | вставляет перед позицией i | | Удалить по индексу | items.pop(i) | удаляет и возвращает элемент | | Удалить по значению | items.remove(x) | удаляет первое вхождение x | | Узнать длину | len(items) | количество элементов | | Отсортировать | items.sort() | сортирует список на месте |

    Пример:

    Перебор списка

    Самый частый способ — for:

    Если нужен индекс:

    Важная ловушка: копия и ссылка

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

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

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

  • Встроенный тип list
  • Кортежи tuple

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

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

    Доступ по индексам

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

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

    Здесь mn, mx = ... — это распаковка кортежа.

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

  • Встроенный тип tuple
  • Словари dict

    Словарь нужен, когда вы хотите получать значение по ключу: как в телефонной книге.

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

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

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

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

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

    Удаление

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

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

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

  • dict.keys() — ключи
  • dict.values() — значения
  • dict.items() — пары (ключ, значение)
  • Типовой шаблон: подсчёт количества

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

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

  • Встроенный тип dict
  • Множества set

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

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

    Фигурные скобки {} для пустого множества не работают, потому что {} — это пустой словарь.

    Уникальность автоматически

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

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

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

    | Операция | Метод | Пример | |---|---|---| | Объединение | a | b или a.union(b) | элементы из обоих | | Пересечение | a & b или a.intersection(b) | общие элементы | | Разность | a - b или a.difference(b) | есть в a, нет в b |

    Пример:

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

  • Встроенный тип set
  • Как выбрать подходящую структуру

    | Задача | Лучший выбор | Почему | |---|---|---| | Нужно хранить элементы по порядку и менять | list | индекс, срезы, удобные методы | | Нужен фиксированный набор значений | tuple | проще защитить от случайных изменений | | Нужны значения по ключу | dict | быстрый доступ value по key | | Нужны уникальные элементы и быстрый in | set | нет повторов, удобные операции множеств |

    Практическая подсказка:

  • если вы мысленно говорите по порядку или по индексу — вероятно list или tuple
  • если вы говорите по имени/ключу — вероятно dict
  • если вы говорите уникальные или без повторов — вероятно set
  • Небольшой пример, который связывает тему с файлами и функциями

    Сделаем мини-утилиту: читаем файл, считаем частоту слов и записываем результат.

    main.py:

    Что здесь используется:

  • dict для подсчёта
  • list(counts.items()) чтобы отсортировать пары
  • функции для структуры кода
  • pathlib и with open(...) для работы с файлами
  • Итоги

    Теперь вы знаете четыре базовые структуры данных Python:

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

    5. Практика: отладка, тестирование и мини-проекты на Python

    Практика: отладка, тестирование и мини-проекты на Python

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

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

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

  • читать traceback (стек вызовов) и быстро понимать, где случилась ошибка
  • использовать несколько подходов к отладке: print, отладчик, pdb
  • писать простые автоматические тесты через unittest
  • проектировать небольшие программы из функций и модулей так, чтобы их было легче проверять
  • !Блок-схема показывает типовой цикл отладки и закрепления исправления тестом

    Отладка: как думать, когда код “не работает”

    Отладка — это не магия, а последовательность действий:

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

    Как читать сообщения об ошибках

    Когда Python падает с ошибкой, вы обычно видите traceback — список вызовов, который заканчивается строкой с типом ошибки.

    Официальная справка про встроенные исключения:

  • Built-in Exceptions
  • Анатомия traceback

    Traceback почти всегда читают снизу вверх:

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

    Ожидаемая ошибка:

  • ValueError: строка не выглядит как целое число
  • Частые ошибки новичка и что они означают

    | Ошибка | Типичная причина | Как быстро проверить | |---|---|---| | SyntaxError | опечатка в синтаксисе (скобки, двоеточие, кавычки) | посмотрите на строку и символ, который подсвечен | | IndentationError | неверные отступы, смешали табы и пробелы | выровняйте отступы, используйте 4 пробела | | NameError | переменная/функция не определена или опечатка в имени | проверьте, где объявлено имя | | TypeError | операция над несовместимыми типами | распечатайте type(...) у значений | | ValueError | тип подходит, но значение “не то” (например, int("abc")) | распечатайте исходную строку, проверьте ввод | | KeyError | нет ключа в словаре | используйте get() или проверку in | | IndexError | индекс вне границ списка | проверьте len(list) и индекс | | FileNotFoundError | неверный путь к файлу | распечатайте путь, проверьте рабочую папку |

    Минимальный воспроизводимый пример

    Если программа большая, полезно “сжать” проблему до минимума:

  • оставьте только тот код, который приводит к ошибке
  • подставьте конкретные входные данные вместо input()
  • временно отключите всё лишнее
  • Зачем это нужно:

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

    Отладка через print()

    Это самый простой и часто достаточный метод.

    Что полезно печатать:

  • значения переменных в ключевых местах
  • типы данных: type(x)
  • размеры коллекций: len(items)
  • Пример: ищем, почему не считается сумма чисел из файла.

    repr(line) полезен тем, что показывает скрытые символы (например, \n).

    Минус подхода: если print становится слишком много, отладка превращается в “шум”. Тогда стоит перейти к отладчику или логированию.

    Отладка через assert

    assert — это проверка, которая должна быть истинной. Если нет — программа падает с AssertionError.

    Пример:

    Когда полезно:

  • вы хотите быстро зафиксировать “ожидаемое условие” прямо в коде
  • вы отлавливаете неправильные данные как можно раньше
  • Важно понимать:

  • assert — это не замена обработке ошибок для пользователя
  • assert чаще применяют как внутренние проверки при разработке
  • Официальная справка (инструкция assert):

  • The assert statement
  • Отладчики: когда нужно пошагово

    pdb: встроенный отладчик Python

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

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

  • pdb — The Python Debugger
  • Мини-пример:

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

  • n — следующая строка (step over)
  • s — зайти внутрь функции (step into)
  • p имя — распечатать значение, например p a
  • c — продолжить выполнение (continue)
  • q — выйти
  • Отладка в VS Code

    Если вы запускаете код в Visual Studio Code, удобно ставить breakpoint (точку остановки) кликом слева от строки и запускать отладку.

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

  • Debugging in Visual Studio Code
  • Плюсы для новичка:

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

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

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

  • вы пишете функцию
  • задаёте входные данные
  • проверяете, что выход совпадает с ожиданием
  • Какие тесты бывают на базовом уровне

    | Вид проверки | Что проверяем | Как обычно делают на старте | |---|---|---| | ручная проверка | “я сам ввёл данные и посмотрел результат” | запускают программу и пробуют разные варианты | | проверки через assert | простые условия внутри кода | assert something == expected | | модульные тесты | отдельные функции по отдельности | unittest |

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

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

    unittest — модуль стандартной библиотеки Python.

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

  • unittest — Unit testing framework
  • Минимальный пример

    Представим, что у вас есть файл calc.py:

    Создадим тесты в test_calc.py:

    Запуск:

    Если всё хорошо, вы увидите, что тесты прошли.

    Что важно в структуре теста

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

    Хорошая привычка: проверять не только “обычный случай”, но и крайние случаи:

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

    Тесты:

    Как писать код так, чтобы его было легко отлаживать и тестировать

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

    Разделяйте “логику” и “ввод/вывод”

    Старайтесь, чтобы функции:

  • получали данные аргументами
  • возвращали результат через return
  • не делали input() внутри и не печатали “всё подряд”
  • Тогда функцию легко протестировать.

    Плохая тестируемость:

    Хорошая тестируемость:

    Делайте маленькие функции

    Функция на 10–20 строк почти всегда проще:

  • понять
  • отладить
  • покрыть тестами
  • Держите данные в коллекциях, а не в десятках переменных

    Если у вас “много однотипных значений”, используйте list или dict. Это уменьшает количество ошибок вида “не ту переменную обновили”.

    Мини-проекты: собрать всё вместе

    Ниже три примера мини-проектов. Они специально построены из тем курса: условия и циклы, функции и модули, файлы, коллекции, плюс отладка и тестирование.

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

    Идея:

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

  • todo_storage.py — загрузка/сохранение
  • todo_app.py — логика команд
  • todo_storage.py:

    todo_app.py:

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

  • при падении на удалении по индексу вы сразу увидите IndexError и поймёте, что нужен диапазон 0 <= idx < len(tasks)
  • функцию print_tasks и логику преобразования номера задачи можно вынести и протестировать отдельно
  • Мини-проект: анализ текста — частота слов и отчёт

    Идея:

  • прочитать файл
  • посчитать частоту слов в dict
  • вывести топ-N слов
  • Ключевой приём: сделать “чистую” функцию, которая не читает файлы, а работает со строкой.

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

    Мини-проект: игра “угадай число” с режимом отладки

    Идея:

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

    Эта программа тренирует:

  • циклы while и continue
  • условия if/elif/else
  • работу со строками и проверкой ввода
  • практическую отладку через “debug-флаг”
  • Практичный рабочий процесс

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

  • запускайте программу маленькими шагами
  • при ошибке сначала читайте последнюю строку traceback, затем ищите вашу строку кода
  • фиксируйте исправления тестом, если ошибка может повториться
  • выносите логику в функции, а ввод/вывод оставляйте в main()
  • Итоги

    Вы научились практическим навыкам, которые делают программирование “взрослым”:

  • читать и понимать traceback
  • отлаживать код через print, assert, pdb и отладчик в VS Code
  • писать базовые модульные тесты через unittest
  • проектировать мини-программы из функций и модулей так, чтобы их было легко отлаживать и проверять
  • Эти умения напрямую усиливают всё, что вы прошли ранее: типы данных, условия, циклы, функции, модули, файлы и коллекции. С этого момента ваши программы будут не только “получаться”, но и становиться надёжнее и понятнее.