Самодостаточный учебный путь по Python: от установки, первого запуска и основ синтаксиса до ООП, асинхронности, типизации, управления памятью и безопасности.
Цель: научиться проектировать, реализовывать, проверять и защищать Python-решения — от небольшого скрипта до системы в эксплуатации.
Курс состоит из 24 последовательных тем. Нулевой вход — установка Python, терминал, первый запуск и чтение traceback — включён в первую тему. Основы вынесены вперёд, тестирование появляется до сложных абстракций, а материал старшего уровня собран в разделах про эксплуатацию и устройство среды выполнения. Тестирование разбито на три темы: базовый набор pytest в основах, изоляция зависимостей и стратегия набора — в модуле эксплуатации, когда есть что изолировать и что измерять. Пройти маршрут только запоминанием ответов недостаточно: каждый модуль заканчивается проверяемым результатом работы.
Каждая тема читается в одном порядке: карта урока, объяснение от базовых понятий к ограничениям, пошаговая практика, упражнения и — у большинства тем — исполняемая лаборатория. В карте есть четыре ориентира:
Основа следующей темы не требует досрочно проходить углубление. К разделам старшего уровня стоит вернуться после знакомства с измерениями, профилированием или системным проектированием. Практика внутри урока идёт от минимального запуска к рабочему сценарию и объяснению внутреннего механизма.
Кодовые блоки имеют один из трёх смыслов:
После упражнений сначала сформулируйте ожидаемое поведение, затем проверьте его
через assert, тест или указанный вывод. Раздел «Самопроверка» задаёт
наблюдаемые критерии, а лаборатория содержит полный автоматический набор тестов.
Код навыка — это не тема и не балл за тест, а наблюдаемое умение. Уровень закрыт, когда студент предъявил перечисленный результат работы и может объяснить решения по рубрике.
J1–J7| Код | Проверяемое умение |
|---|---|
J1 | Воспроизводимо установить проект, запустить CLI и тесты |
J2 | Выбрать типы данных и диагностировать изменяемость/общие ссылки |
J3 | Реализовать функцию и публичный контракт по спецификации |
J4 | Обработать ожидаемые ошибки, не скрывая системные |
J5 | Читать и писать текст, JSON, CSV и TOML через pathlib |
J6 | Написать pytest-тесты, параметризацию и проверку старой ошибки |
J7 | Применить журналирование, строки документации, форматирование и базовую типизацию |
Итоговая работа уровня: CLI-нормализатор данных с тестами, структурированными ошибками, журналированием и документацией.
M1–M8| Код | Проверяемое умение |
|---|---|
M1 | Спроектировать модуль и устойчивый публичный API |
M2 | Выбрать функцию, dataclass, композицию или наследование |
M3 | Построить итератор, генератор, контекстный менеджер или декоратор |
M4 | Проверить типизированную границу через Protocol, обобщения и сужение типов |
M5 | Реализовать и протестировать конкурентный I/O-код |
M6 | Изолировать зависимость через тестовые двойники |
M7 | Найти и закрыть границу инъекции/десериализации |
M8 | Профилировать до оптимизации и доказать результат измерением |
Итоговая работа уровня: типизированный сервис обработки задач с асинхронным вводом-выводом, тестовыми двойниками, границей безопасности и измеряемой наблюдаемостью.
S1–S9| Код | Проверяемое умение |
|---|---|
S1 | Объяснить дескрипторы, MRO и поиск атрибутов исполняемой трассировкой |
S2 | Отделить гарантию языка от детали CPython или конкретной версии |
S3 | Диагностировать удержание памяти, циклы и влияние распределителя памяти |
S4 | Спроектировать отмену, обратное давление и структурированную конкурентность |
S5 | Выбрать асинхронность, потоки, процессы или интерпретаторы по характеру нагрузки |
S6 | Обосновать метакласс или заменить его простым механизмом |
S7 | Провести разбор производительности без показательных измерений |
S8 | Провести разбор безопасности и архитектуры со сценариями злоупотребления |
S9 | Защитить решение, альтернативы и остаточные риски |
Итоговая работа уровня: аудит и развитие конвейера событий с пробами среды выполнения, внесением сбоев, моделью угроз и протоколом выбора на основе измерений.
Цель модуля — собрать воспроизводимое окружение и научиться писать небольшие программы с явными контрактами и тестами.
| № | Тема | Практическое доказательство |
|---|---|---|
| 1 | Базовые практики Python | каркас пакета, небольшой файловый ETL и журналирование |
| 2 | Базовые типы данных | лаборатория склада, тесты общих ссылок и заметка о памяти |
| 3 | Управляющие конструкции | конечный автомат или синтаксический анализатор с таблицей случаев |
| 4 | Функции и аргументы | движок правил заказа и защита API-контракта |
| 5 | Строки и форматирование | нормализатор границы Unicode и текста с тестами |
| 6 | Исключения | доменная политика ошибок и регрессионные тесты |
| 7 | Тестирование: pytest и фикстуры | набор pytest-тестов для основного контракта |
Цель модуля — строить расширяемый код, управлять ресурсами и проверять контракты на уровне выполнения и статической типизации.
| № | Тема | Практическое доказательство |
|---|---|---|
| 8 | Итераторы и генераторы | потоковая обработка с ограниченной памятью |
| 9 | ООП | переработка «функция ↔ объект» и трассировка модели данных |
| 10 | Классы данных | типизированная модель и сравнение альтернатив |
| 11 | Замыкания и декораторы | декоратор с сохранением метаданных и тестами отказа |
| 12 | Контекстные менеджеры | жизненный цикл ресурса с внесением сбоев |
| 13 | Стандартная библиотека | решение средствами стандартной библиотеки и разбор альтернатив |
| 14 | Система типов | положительные и отрицательные сценарии проверки типов |
| 15 | Паттерны проектирования | GoF-вариант и более простая переработка средствами Python |
Цель модуля — принимать измеримые инженерные решения для конкурентности, безопасности и производительности.
| № | Тема | Практическое доказательство |
|---|---|---|
| 16 | Тестовые двойники | доказанное число обращений к внешней системе без единого сетевого вызова |
| 17 | Стратегия тестового набора | ветвевое покрытие критичного модуля и разбор выжившего мутанта |
| 18 | Асинхронный Python | устойчивый пакетный клиент и доказательство отмены |
| 19 | Безопасность в Python | модель угроз, сценарии злоупотребления и регрессионный тест уязвимости |
| 20 | Профилирование и оптимизация | воспроизводимый отчёт профилирования до оптимизации |
| 21 | Производительность Python | решение на основе измерений без обещанного ускорения |
Цель модуля — связать поведение программы с моделью объектов, средой CPython и механизмами метапрограммирования, не выдавая детали реализации за контракт языка.
| № | Тема | Подтверждение навыков старшего уровня |
|---|---|---|
| 22 | Управление памятью | опыт с tracemalloc/GC и явной границей версии |
| 23 | Продвинутый Python | проба атрибутного протокола, AST и процессов с технической запиской |
| 24 | Метаклассы и дескрипторы | реализация метакласса и упрощение через декоратор или __init_subclass__ |
Protocol, ParamSpec и
отрицательным примерам статической проверки.__init_subclass__.Двадцать две тематические лаборатории и три итоговые работы уровня опубликованы в отдельном GitLab-проекте.
Материалы курса закреплены за неизменяемым выпуском
v0.6.2,
чтобы условие и проверки не менялись во время выполнения работы.
В выпуск входят:
__init_subclass__ и метакласса;Эталонные решения проходят 326 открытых проверок учебного контракта на CPython 3.12, 3.13 и 3.14. Открытые тесты — минимальный контракт, а не полная спецификация.
Не пытайтесь закрыть весь маршрут одним проходом. Сначала подтвердите основу, примените её в задаче, приближенной к эксплуатации, а затем возвращайтесь к углублению с измерениями и вопросом: «какой контракт я действительно могу гарантировать?»
Высокоуровневый язык программирования общего назначения с динамической типизацией и автоматическим управлением памятью. Акцент на читаемость кода и простоту синтаксиса (PEP 8). Интерпретируемый, с множеством реализаций (CPython, PyPy, Jython).
Пример
print('Hello, world!') — простейшая программа на Python, демонстрирующая динамическую типизацию и простой синтаксис.Связанные термины
Официальная и наиболее распространённая реализация Python, написанная на C. Является эталонной реализацией, используемой в подавляющем большинстве случаев. Управляет GIL (Global Interpreter Lock).
Пример
Когда вы запускаете `python script.py`, вы используете CPython. Он компилирует код в байткод и выполняет его в виртуальной машине.Связанные термины
Официальный стиль-гайд для написания кода на Python. Определяет правила оформления: отступы (4 пробела), именование (`snake_case`), размещение пробелов, длина строк и т.д. Соблюдение PEP 8 повышает читаемость и согласованность кода.
Пример
Правильно: `def calculate_total(items):`; Неправильно: `def CalculateTotal(Items):` или `def calculate_total(items):` с табуляцией.Связанные термины
Встроенный неизменяемый целочисленный тип. В Python 3 имеет неограниченную точность (в отличие от C). Поддерживает операции `+`, `-`, `*`, `//`, `%`, побитовые операции и т.д.
Пример
x = 42
y = -1000000000000
z = x + y # z == -999999999958Связанные термины
Встроенный неизменяемый тип для представления текста (Unicode-строки). Поддерживает индексацию, срезы, методы `.lower()`, `.split()`, `.format()`, f-строки и конкатенацию.
Пример
name = "Alice"
message = f"Hello, {name}!" # 'Hello, Alice!'Связанные термины
Изменяемая упорядоченная коллекция элементов произвольных типов. Поддерживает индексацию, срезы, методы `.append()`, `.pop()`, `.sort()`, `.extend()` и операторы `+`, `*`.
Пример
items = [1, "hello", True]
items.append(42) # items == [1, "hello", True, 42]Связанные термины
Неизменяемая упорядоченная коллекция элементов. Часто используется для группировки данных, возвращаемых функциями, или как ключи в словарях. Создаётся с помощью запятых или скобок.
Пример
point = (10, 20)
name, age = ("Bob", 30) # распаковкаСвязанные термины
Изменяемая неупорядоченная коллекция пар «ключ-значение». Ключи должны быть хешируемыми (обычно неизменяемые типы). Поддерживает доступ по ключу `d[key]`, методы `.get()`, `.items()`, `.update()`.
Пример
user = {"name": "Alice", "age": 30}
print(user["name"]) # 'Alice'Связанные термины
Блок кода, предназначенный для выполнения конкретной задачи и повторного использования. Объявляется через `def`, может принимать аргументы, возвращать значение через `return`. В Python — объект первого класса.
Пример
def greet(name):
return f"Hello, {name}!"
print(greet("World")) # 'Hello, World!'Связанные термины
Специальные параметры для передачи переменного числа позиционных (`*args`) и именованных (`**kwargs`) аргументов в функцию. Позволяют создавать гибкие API и обёртки.
Пример
def log(message, *args, **kwargs):
print(f"[{kwargs.get('level', 'INFO')}] {message}", *args)
log("Error", "code=404", level="ERROR")Связанные термины
Анонимная функция, определяемая в одной строке с помощью ключевого слова `lambda`. Используется для кратких операций, часто в качестве аргументов для функций высшего порядка (`map`, `filter`, `sorted`).
Пример
squares = list(map(lambda x: x**2, [1, 2, 3])) # [1, 4, 9]Связанные термины
Шаблон для создания объектов (экземпляров), определяющий их атрибуты и методы. Реализует принципы ООП: инкапсуляцию, наследование и полиморфизм. Объявляется через `class`.
Пример
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
return "Woof!"Связанные термины
Ссылка на текущий экземпляр класса, передаваемая как первый аргумент в методы. Аналог `this` в других языках. Не является зарезервированным словом, но по соглашению используется именно так.
Пример
def __init__(self, value):
self.value = value # self ссылается на создаваемый экземплярСвязанные термины
Функция, которая «захватывает» переменные из внешней области видимости (замыкает их). Возникает, когда внутренняя функция ссылается на переменные внешней функции после её завершения.
Пример
def make_multiplier(n):
def multiplier(x):
return x * n # n захвачена из outer scope
return multiplier
double = make_multiplier(2)Связанные термины
Функция, принимающая другую функцию и возвращающая новую функцию (часто с добавленным поведением). Применяется с помощью `@decorator`. Реализуется через замыкания.
Пример
@timeit
def slow_function():
time.sleep(1)
# Декоратор timeit измеряет время выполненияСвязанные термины
Функция, использующая `yield` вместо `return`, чтобы возвращать итератор. При вызове не выполняет код сразу, а создаёт объект-генератор, который выдаёт значения по запросу (лениво). Экономит память.
Пример
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
list(fibonacci(5)) # [0, 1, 1, 2, 3]Связанные термины
Объект, реализующий протокол итерации: методы `__iter__()` и `__next__()`. Позволяет обходить коллекцию по одному элементу за раз. Все генераторы — итераторы, но не наоборот.
Пример
it = iter([1, 2, 3])
print(next(it)) # 1
print(next(it)) # 2Связанные термины
Ключевые слова для написания асинхронного кода. `async def` объявляет корутину, `await` приостанавливает выполнение до завершения асинхронной операции (например, I/O). Работает в рамках event loop (`asyncio`).
Пример
async def fetch_data(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
return await resp.text()Связанные термины
Объект, представляющий ошибку или необычную ситуацию во время выполнения программы. Вызывается через `raise`, перехватывается через `try/except/finally`. Позволяет отделить нормальный поток от обработки ошибок.
Пример
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"Ошибка: {e}")Связанные термины
Объект, реализующий методы `__enter__()` и `__exit__()`, позволяющий управлять ресурсами (файлы, соединения) с помощью конструкции `with`. Гарантирует освобождение ресурсов даже при исключениях.
Пример
with open("file.txt") as f:
data = f.read() # Файл закроется автоматическиСвязанные термины
Декоратор из модуля `dataclasses`, автоматически генерирующий методы `__init__`, `__repr__`, `__eq__` и другие для классов, предназначенных для хранения данных. Упрощает создание DTO и записей.
Пример
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(1, 2) # p.x == 1, p.y == 2Связанные термины
Файл с расширением `.py`, содержащий Python-код (функции, классы, переменные). Импортируется с помощью `import`. Корневой модуль — это файл, запущенный напрямую (`__name__ == '__main__'`).
Пример
# file: math_utils.py
def add(a, b):
return a + b
# В другом файле:
import math_utils
print(math_utils.add(2, 3))Связанные термины
Каталог, содержащий файл `__init__.py` (может быть пустым), который позволяет организовать модули в иерархию. Импортируется как `import package.module` или `from package import module`.
Пример
project/
├── __init__.py
├── core/
│ ├── __init__.py
│ └── utils.py
from project.core.utils import helperСвязанные термины
Состав курса, уровни, практика и способы проверки знаний.
Курс включает 24 темы и 485 вопросов с разбором ответа, а также 22 тематические лабораторные работы. Начать можно с первой темы курса.
Маршрут охватывает уровни Junior, Middle, Senior. Темы расположены от основы к более сложным инженерным задачам, поэтому можно начать с подходящего места и не пропускать важные зависимости.
На вкладке «Практика» доступно 22 задания и 3 итоговые работы для подтверждения уровня. Решение выполняется в своём Git-репозитории и отправляется ссылкой на конкретный коммит. Открыть практику курса.
После прохождения тем доступен зачёт по курсу «Python» — 20 случайных вопросов с порогом 80%. После зачёта открывается экзамен с развёрнутыми ответами и автоматической оценкой, приближённый к техническому собеседованию.
Да, курс полностью бесплатный: все 24 темы доступны без оплаты.