Модульный учебник Python для разработчиков уровня Middle

🎓 Модульный учебник по Python для Middle-разработчиков
Этот учебник создан для тех, кто уже пишет на Python, но хочет выйти за рамки базовых конструкций. Здесь — практичные модули с упором на архитектуру, производительность, тестирование, чистый код и современные практики разработки.
🔧 Каждый модуль — это отдельный блок знаний: теория + реальные кейсы + трюки из индустрии.
🎯 Только то, что реально нужно миддлу: от дебага и профилирования до async, typing, CI/CD и LLM-интеграций.
Без воды. С кодом. По делу.
pythonl – в нашем канале мы учим python на кринках и шортах, структурировано, наглядно, понятно.
Настройка окружения и инструментов Python

Чтобы разработка была управляемой, создавайте виртуальные окружения. Модуль venv позволяет создавать изолированные «виртуальные окружения» с собственным набором пакетов Python 1 . Обычно после установки Python менеджер pip уже доступен (например, при установке с официального сайта или при создании venv) 2 . Для создания и активации окружения используйте команды: – python -m venv venv – создать окружение в папке venv .
source venv/bin/activate (Linux/macOS) или .\venv\Scripts\activate (Windows) – активировать окружение. – pip install -r requirements.txt – установить зависимости. Рекомендуется не хранить папку окружения в системе контроля версий, а фиксировать зависимости через requirements.txt или pyproject.toml. Poetry – современный инструмент для управления зависимостями и создания пакетов. Он использует файл
pyproject.toml и обеспечивает детерминированные сборки через poetry.lock 3 . Poetry удобно устанавливать через системный менеджер пакетов (например, pipx ), а не внутри каждого проекта 4 .
Проектная структура. Следите за чистотой структуры: держите код модульным, с понятными именами файлов. Рекомендуют использовать короткие имена модулей (всё в нижнем регистре, без спецсимволов) 5 . Избегайте запутанных зависимостей между модулями и большого глобального состояния. Стандартная структура проекта может быть, например:
my_project/ ├─ .venv/ ├─ src/
- │ ├─ package/
- │ └─ module.py ├─ tests/
# виртуальное окружение (в .gitignore) # исходный код (можно вместо src/ корень) # главный пакет с __init__.py
# тесты
├─ requirements.txt # или pyproject.toml, poetry.lock
└─ README.md
– Практическое задание: Создайте виртуальное окружение, установите туда библиотеку ( pip install ) и попробуйте импортировать её в интерпретаторе. Попрактикуйтесь с venv и pip (напишите команды).
Веб-разработка с Django, Flask, FastAPI
Веб-фреймворки помогают быстро развивать сервисы. Django – «батарейки в комплекте», включает ORM, админку, шаблонизатор. Flask – минималистичный микрофреймворк для небольших проектов и API. FastAPI – современный асинхронный фреймворк, ориентированный на высокую производительность, автоматически генерирует документацию и использует
аннотации типов 6 . Как правило, выбирают Flask для небольших API, Django для крупных приложений и администраторов, FastAPI для критичных по скорости сервисов 7 6 .
При построении REST API следуйте архитектурным принципам REST: ресурсы (сущности) обращаются через HTTP-методы ( GET , POST , PUT , DELETE ) 8 . Например, Django REST Framework или FastAPI отлично подходят для создания REST API. Пример простого FastAPI- сервиса:
from fastapi import FastAPI from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel): name: str
price: float
@app.get("/items/{item_id}") async def read_item(item_id: int):
return {"id": item_id, "name": f"Item{item_id}"}
@app.post("/items/") async def create_item(item: Item):
return {“id”: 1, “name”: item.name, “price”: item.price}
Такой API будет доступен по HTTP, автоматически сгенерирует Swagger-документацию
Архитектура (Django MVT). Django использует паттерн MVT (Model–View–Template) – аналог MVC. Модель (Model) описывает данные и логику доступа к БД, Представление (View) обрабатывает запросы и формирует контекст, Шаблон (Template) рендерит HTML на основе данных 9 10 . На схеме ниже показана схема взаимодействия частей MVT: модель хранит данные, представление передаёт их в шаблон, шаблон выводит пользователю 9 .
Рисунок: упрощённая схема MVT в Django (Model — View — Template) 9 .
Деплой. В продакшене веб-сервисы обычно запускают через WSGI/ASGI-сервер (Gunicorn, uWSGI, Daphne, Uvicorn) за обратным прокси (Nginx). Например, для Django часто используют Gunicorn + Nginx 11 . Nginx обрабатывает статические файлы и SSL, перенаправляя запросы на Gunicorn. FastAPI запускают через Uvicorn или Hypercorn за Nginx. После настройки сервера контейнеры или виртуальные машины, релиз загружают на прод (например, через Docker, докер-композ, облачные CI/CD).
• Задача: Напишите простой REST API (на Flask или FastAPI) с одним GET -эндпоинтом и протестируйте его локально. Попробуйте задеплоить простой Django-проект на локальный Nginx+Gunicorn или с помощью Docker Compose.
Асинхронное программирование (asyncio, aiohttp)

В Python для высокопроизводительных I/O-ориентированных приложений используют асинхронность на основе asyncio. Модуль asyncio предоставляет инфраструктуру для конкурентного выполнения задач через цикл событий, используя синтаксис async/await 12 . Например:
import asyncio
async def main(): print("Hello ...") await asyncio.sleep(1) # имитирует асинхронную операцию print("... World!")
asyncio.run(main())
Этот код создаёт и запускает корутину main , печатает «Hello …», ждёт секунду и печатает «… World!» 13 . Асинхронные функции позволяют одновременно обрабатывать множество операций ввода-вывода (HTTP-запросы, БД, файлы), не блокируя поток.
Для веб-запросов есть aiohttp – асинхронный HTTP-клиент/сервер на базе asyncio 14 . Он позволяет писать async-клиенты и серверы. Например, клиентская часть:
import aiohttp, asyncio
async def fetch(url): async with aiohttp.ClientSession() as session:
async with session.get(url) as resp: return await resp.text()
text = asyncio.run(fetch("http://example.com")) print(text)
Асинхронные веб-фреймворки (Sanic, FastAPI) и драйверы к БД ( asyncpg для PostgreSQL, databases для SQL, aiomysql , motor для MongoDB) базируются на asyncio 12 . Благодаря
этому мы можем обрабатывать множество соединений без создания сотен потоков.
• Задача: Реализуйте две асинхронные корутины и запустите их вместе через asyncio.gather , чтобы увидеть конкурентное выполнение. Попробуйте написать
простую async-функцию, которая обращается к публичному API с помощью aiohttp . Data Science и машинное обучение (Pandas, NumPy, scikit-
learn, PyTorch/TensorFlow)
Для анализа данных и машинного обучения в Python существует мощный стек библиотек:
• NumPy – фундаментальный пакет для работы с многомерными массивами и линейной алгеброй. «NumPy – это основной пакет для вычислений с массивами в Python» 15 . Он обеспечивает быстрые операции над массивами numpy.ndarray с векторизацией. Пример:
import numpy as np a = np.arange(1, 6) # array([1,2,3,4,5]) print(a * 2) # [2 4 6 8 10]
• Pandas – библиотека для манипуляций данными в табличном виде. «Pandas – быстрый, мощный, гибкий и простой в использовании инструмент для анализа и обработки данных, написанный на Python» 16 . Она предоставляет структуры DataFrame и Series для работы с таблицами. Пример:
import pandas as pd df = pd.DataFrame({"age": [25, 30], "name": ["Alice", "Bob"]}) print(df.loc[0, "name"]) # Alice
• scikit-learn – библиотека для классического машинного обучения. «Scikit-learn – это библиотека для машинного обучения, предоставляющая простые и эффективные
инструменты для анализа и моделирования данных» 17 . Она включает алгоритмы классификации, регрессии, кластеризации и т.д. Пример:
from sklearn.linear_model import LinearRegression import numpy as np X = np.array([[1], [2], [3]]) y = np.array([2, 4, 6])
model = LinearRegression().fit(X, y) print(model.predict([[4]])) # ~8.0
• TensorFlow и PyTorch – фреймворки для глубокого обучения. TensorFlow – «end-to-end платформа с гибкой экосистемой» 18 от Google, подходит для промышленной разработки. PyTorch – «открытый фреймворк для глубинного обучения, известный гибкостью и удобством» 19 . PyTorch особенно удобен для прототипирования благодаря динамическим вычислительным графам 20 . Пример (PyTorch):
import torch x = torch.tensor([[1.0, 2.0]]) linear = torch.nn.Linear(2, 1) print(linear(x)) # выводит предсказание (веса случайны)
В типичном ML-проекте создаётся конвейер (pipeline): загрузка данных → предобработка → разделение на тренировочную/тестовую выборки → обучение модели → валидация и сохранение модели. На рисунке ниже схематично показаны этапы стандартного ML-пайплайна (DAG с зависимостями между этапами) 21 :
• Задача: С использованием Pandas прочитайте CSV-файл в DataFrame, выполните простую фильтрацию и статистику. Постройте модель регрессии из scikit-learn на синтетических данных. Попробуйте натренировать простой нейрон (PyTorch или TensorFlow) и оценить его на тестовых данных.
Тестирование и обеспечение качества (pytest, unittest, mock, flake8, mypy, CI)
Код должен быть покрыт тестами и проверен статически. В Python есть встроенный фреймворк unittest и популярный внешний pytest. unittest – структурированный (в духе JUnit) фреймворк, где тесты оформляются как методы внутри класса 22 . pytest – более гибкий и удобный: нет нужды в классах, используются обычные функции с assert , есть мощная система фикстур и плагинов 23 . Например, тест на pytest: def add(a, b):
return a + b
def test_add(): assert add(1, 2) == 3
Pytest автоматически обнаружит test_ -функцию и запустит её. Он также предоставляет
расширенные возможности (параметризация, замечательный вывод ошибок и т.п.) 24 .
Мокирование. Для имитации частей системы в тестах используют unittest.mock . С его помощью можно подменять реальные объекты (например, запросы к БД или сети) на фиктивные. Пример:
from unittest.mock import patch
@patch('requests.get') def test_fetch(mock_get):
mock_get.return_value.status_code = 200 mock_get.return_value.text = 'ok' import requests resp = requests.get('http://example.com') assert resp.text == 'ok'
Статика кода. Инструменты линтинга и проверки кода полезны для качества. flake8 – линтер, проверяет соответствие PEP8, находит синтаксические ошибки. mypy – статическая проверка типов: анализирует аннотации и находит несоответствия. Например, если функция объявлена как принимающая str , а передаётся int , mypy об этом скажет (во время статического анализа, а не при запуске).
CI/CD. Автоматизация тестов и проверок на каждый коммит делается с помощью CI-систем (GitHub Actions, GitLab CI и др.). Например, в GitHub Actions есть готовые шаблоны для Python: actions/setup-python , затем запускаем pytest , flake8 , и т.п. Документация GitHub отмечает: «Можно создать CI workflow для сборки и тестирования вашего Python-проекта» 25 .
Настройте файл .github/workflows/ci.yml с шагами: checkout , setup-python , pip install , pytest и прочими.
• Задача: Напишите несколько тестов на pytest для небольшой функции (например, вычисление факториала или работу со строками). Настройте простейший GitHub Actions workflow, который запускает эти тесты и линтер при каждом пуше.
DevOps и контейнеризация (Docker, Docker Compose, GitHub Actions, деплой)
Современные приложения часто контейнеризуют через Docker. Docker упрощает настройку окружения на сервере. Dockerfile описывает, как собрать образ. Рекомендации для Python- контейнеров: использовать мультиступенчатую сборку для уменьшения финального размера и безопасности 26 , минимальные базовые образы ( python:3.X-slim или alpine ), объединять команды RUN для уменьшения числа слоёв 27 28 . Например, распространённый паттерн:
# Stage 1: сборка
FROM python:3.12-slim AS builder WORKDIR /app COPY requirements.txt . RUN pip wheel --no-cache-dir -r requirements.txt -w wheels
# Stage 2: рантайм
FROM python:3.12-slim WORKDIR /app COPY --from=builder /app/wheels /wheels COPY requirements.txt . RUN pip install --no-index --no-cache /wheels/*
COPY . . CMD ["python", "app.py"]
Это позволяет на этапе сборки устанавливать компиляторы и зависимости, а в итоговый образ попадёт только то, что нужно для запуска (образ становится «легче, безопаснее» 26 ).
Docker Compose позволяет описать мультиконтейнерные приложения (например, web-сервис + база данных + кеш) в docker-compose.yml . В нём задают сервисы, сети и тома. Также CI/CD (например, GitHub Actions) могут собирать образы и деплоить их. В GitHub Actions можно использовать официальные Docker Build и Docker push actions для автоматической публикации образов.
• Задача: Напишите простой Dockerfile для вашего Python-приложения (например, Flask или скрипта) и убедитесь, что образ успешно строится. Попробуйте запустить приложение внутри контейнера. Настройте docker-compose.yml для запуска приложения вместе с сервисом базы данных (PostgreSQL или Redis).
Работа с базами данных (SQLAlchemy, PostgreSQL, Alembic, Redis, MongoDB)
Хранение данных – важная часть. Для реляционных баз часто используют PostgreSQL. Чтобы не писать сырые SQL-запросы, используют ORM-библиотеки, например SQLAlchemy: «SQLAlchemy – это Python-инструментарий для работы с SQL и ORM, который даёт разработчикам полную гибкость SQL» 29 . Пример модели и запроса на SQLAlchemy:
from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import declarative_base, sessionmaker
Base = declarative_base() class User(Base):
__tablename__ = "users" id = Column(Integer, primary_key=True) name = Column(String)
engine = create_engine("postgresql://user:pass@localhost/db") Session = sessionmaker(bind=engine) session = Session() # Создание таблиц
Base.metadata.create_all(engine)
# Создание и запрос
user = User(name="Alice") session.add(user) session.commit() print(session.query(User).filter_by(name="Alice").first().id)
Для управления версиями схем баз данных используют Alembic – инструмент миграций для SQLAlchemy 30 . Он позволяет автоматически генерировать скрипты миграций после изменения моделей и применять их к базе.
Redis – это быстрый ключ-значение хранилище в оперативной памяти. «Redis – это открытое (BSD) хранилище ключ-значение, которое может работать как in-memory база и как кэш» 31 . Его часто применяют для кеширования часто используемых данных или для реализации очередей/ pub-sub. Python-клиент – redis-py .
MongoDB – популярная документная NoSQL-база. В ней данные хранятся в виде гибких JSON- подобных документов (BSON) вместо таблиц. Документные базы – это нереляционные базы данных, которые используют гибкие схемы 32 . В Python для работы есть драйвер pymongo и ODM (например, motor для асинхронных операций).
• Задача: С помощью SQLAlchemy создайте модель и миграцию Alembic для простой таблицы (например, Book(id, title) ). Реализуйте несколько запросов на SQLAlchemy (добавление, выборку, обновление). Настройте redis и сохраните в него пару ключ- значение через redis-py . Если есть время, попробуйте сохранить JSON-документ в MongoDB и прочитать его на Python.
Шаблоны проектирования и архитектура (SOLID, Чистая архитектура)

Для крупных проектов важно проектировать код правильно. SOLID-принципы – фундамент в ООП, улучшают читаемость и поддержку кода 33 : – S (SRP): каждый класс/модуль должен иметь одну ответственность. – O (OCP): «закрыт для модификации, открыт для расширения». – L (LSP): наследник должен корректно заменять базовый класс. – I (ISP): клиент не должен зависеть от методов, которыми он не пользуется (интерфейсы маленькие). – D (DIP): зависимости – через абстракции, а не конкретные реализации. Эти идеи помогают, например, разделять логику работы с данными, бизнес-логику и представление, что делает код гибче 33 .
Чистая архитектура (Clean Architecture). Идея – поместить бизнес-логику в центр приложения, а внешние детали (БД, UI, фреймворки) – «на периферию». Core-слой знает только об интерфейсах внешних компонентов, но не о конкретных реализациях. Внешние модули (контроллеры, адаптеры) реализуют интерфейсы и подключаются к ядру. По сути, все зависимости«смотрятвнутрь»(DependencyInversion) 34 .Такойподходупрощаеттестированиеи замену компонентов. К примеру, слой взаимодействия с БД может реализовывать общий интерфейс репозитория; при этом ядро бизнес-логики ничего не знает о конкретной СУБД.
• Задача: Примените один из шаблонов (например, Repository или Factory) в небольшом примере. Определите абстракции (интерфейсы) и реализуйте их в классах. Проверьте, что ваш класс зависит от интерфейса, а не от конкретной реализации (пример DIP).
Оптимизация производительности и профилирование (GIL, многопоточность, multiprocessing, профилировщики)
Python имеет Global Interpreter Lock (GIL) – глобальную блокировку интерпретатора: в каждый момент только один поток выполняет Python-байт-код 35 . Это означает, что чисто вычислительные задачи на нескольких потоках не распараллеливаются на нескольких ядрах – каждый поток берёт GIL по очереди 35 . Поэтому для CPU-bound задач в Python обычно используют многопроцессность ( multiprocessing ) или инструменты за пределами CPython (например, C-расширения, модули numba ). В то же время I/O-bound задачи (сетевые запросы, ввод-вывод) выигрывают от потоков или asyncio – потому что во время ожидания GIL отпускается, и другой поток может исполняться.
Для измерения производительности и поиска «узких мест» служат профилировщики. В стандартной библиотеке есть cProfile – детерминированный профайлер на C (рекомендуется для большинства случаев) 36 . Запустив программу через cProfile , получаем статистику времени выполнения функций. Пример использования:
python -m cProfile myscript.py
Он выведет таблицу вызовов функций и затраченного на них времени. Для более тонкого анализа есть инструменты типа line_profiler (строковый профиль) и memory_profiler (память). Для быстрого измерения небольших фрагментов кода полезен модуль timeit (точный таймер для маленьких тестов) 36 .
• Задача: Напишите функцию, выполняющую какую-нибудь тяжёлую операцию (например, суммирование в цикле) и проанализируйте её с помощью cProfile . Обратите внимание, какие функции занимают больше всего времени. Попробуйте также использовать timeit для сравнения разных реализаций.
Расширенные возможности Python (метапрограммирование, декораторы, дескрипторы, typing)
Python предоставляет гибкие инструменты для метапрограммирования:
• Метапрограммирование. Вы можете создавать классы динамически с помощью type ,
изменять атрибуты объектов, использовать метаклассы. Например:
MyClass = type("MyClass", (object,), {"x": 10}) obj = MyClass() print(obj.x) # 10
Это создаёт класс с атрибутом x . Метаклассы ( __metaclass__ ) позволяют менять класс- природу, перехватывая его создание. Часто их используют для регистрации классов или автоматической генерации методов.
•Декораторы позволяют оборачивать функции (и методы/классы) в другие функции, расширяя их поведение «снаружи», без изменения самого тела. «Декораторы позволяют модифицировать или расширять поведение функций и методов без изменения их кода. При использовании декоратора мы оборачиваем функцию в другую функцию, которая получает оригинальную как аргумент и возвращает её модифицированную версию» 37 . Пример:
def log_calls(func): def wrapper(*args, **kwargs):
print(f"Calling {func.__name__}")
return func(*args, **kwargs) return wrapper
@log_calls def greet(name):
print(f"Hello, {name}")
greet("Alice") # Вывод: Calling greet # Hello, Alice
Декораторы часто используют для логирования, проверки прав доступа, кэширования результатов и т.д.
•Дескрипторы – объекты, которые контролируют доступ к атрибутам через методы __get__ , __set__ и __delete__ . Если класс А имеет атрибут x = Descriptor() , то при обращении к a.x вызываются методы дескриптора. Это удобно, например, для валидации данных при присвоении. (Свойство @property – частный случай
дескриптора). Например, дескриптор, проверяющий тип:
class StringDescriptor: def __get__(self, instance, owner):
return instance._s def __set__(self, instance, value):
if not isinstance(value, str): raise TypeError("Expected a string")
instance._s = value
class A: s = StringDescriptor()
a = A() a.s = "hello" # ОК # a.s = 123 # Ошибка: Expected a string
• Типизация (typing). В Python 3 поддерживаются аннотации типов. Модуль typing содержит продвинутые подсказки (например, List[int], Optional[str], Union, Protocol и пр.). Аннотации не выполняются во время работы программы, а служат для
статического анализа (mypy, IDE) 38 . Пример: def add(x: int, y: int) -> int:
return x + y
Здесь указано, что x и y ожидаются как int , а функция возвращает int . Сама по себе проверка типов в рантайме не происходит (это подчёркивает документация: «рантайм не выполняет проверки типов; их обрабатывают сторонние инструменты» 38 ).
• Задача: Напишите свой декоратор (например, для кэширования результатов функции или для учёта времени выполнения). Попробуйте создать дескриптор (например, для числового атрибута с контролем диапазона). Добавьте аннотации типов к нескольким функциям и проверьте их с помощью mypy .
Источники:
1 venv — Creation of virtual environments — Python 3.13.3 documentation https://docs.python.org/3/library/venv.html
2 Installation – pip documentation v25.1.1 https://pip.pypa.io/en/stable/installation/
3 4 Dependency Management With Python Poetry – Real Python https://realpython.com/dependency-management-python-poetry/
5 Structuring Your Project — The Hitchhiker’s Guide to Python https://docs.python-guide.org/writing/structure/
6 7 Comparison of Flask, Django, and FastAPI: Advantages, Disadvantages, and Use Cases | by Gen. Devin DL. | Medium https://medium.com/@tubelwj/comparison-of-flask-django-and-fastapi-advantages-disadvantages-and-use- cases-63e7c692382a
8 REST – Wikipedia https://en.wikipedia.org/wiki/REST
9 10 Django Project MVT Structure | GeeksforGeeks https://www.geeksforgeeks.org/django-project-mvt-structure/
11 Securely Deploy a Django App With Gunicorn, Nginx, & HTTPS – Real Python https://realpython.com/django-nginx-gunicorn/
12 13 asyncio — Asynchronous I/O — Python 3.13.3 documentation https://docs.python.org/3/library/asyncio.html
14 Welcome to AIOHTTP — aiohttp 3.12.6 documentation https://docs.aiohttp.org/en/stable/
15 numpy · PyPI https://pypi.org/project/numpy/1.22.0/
16 pandas – Python Data Analysis Library https://pandas.pydata.org/
17 What is python scikit library? | GeeksforGeeks https://www.geeksforgeeks.org/what-is-python-scikit-library/
18 TensorFlow | Google Open Source Projects https://opensource.google/projects/tensorflow
19 20 What is PyTorch? | Data Science | NVIDIA Glossary https://www.nvidia.com/en-us/glossary/pytorch/
21 ML Pipeline Architecture Design Patterns (With Examples) https://neptune.ai/blog/ml-pipeline-architecture-design-patterns
22 23 24 Pytest vs Unittest: A Comparison | BrowserStack https://www.browserstack.com/guide/pytest-vs-unittest
25 Building and testing Python – GitHub Docs https://docs.github.com/en/actions/use-cases-and-examples/building-and-testing/building-and-testing-python
26 27 28 Docker Best Practices for Python Developers | TestDriven.io https://testdriven.io/blog/docker-best-practices/
29 SQLAlchemy – The Database Toolkit for Python https://www.sqlalchemy.org/
30 Welcome to Alembic’s documentation! — Alembic 1.16.1 documentation https://alembic.sqlalchemy.org/en/latest/
31 Using GridPane Redis Object Caching | GridPane https://gridpane.com/kb/using-gridpane-redis-object-caching/
32 Document Database – NoSQL | MongoDB https://www.mongodb.com/resources/basics/databases/document-databases
33 SOLID Principles: Improve Object-Oriented Design in Python – Real Python https://realpython.com/solid-principles-python/
34 Understanding Hexagonal, Clean, Onion, and Traditional Layered Architectures: A Deep Dive | by Roman Glushach | Mediumhttps://romanglushach.medium.com/understanding-hexagonal-clean-onion-and-traditional-layered-architectures-a-deep- dive-c0f93b8a1b96
35 What Is the Python Global Interpreter Lock (GIL)? – Real Python https://realpython.com/python-gil/
36 The Python Profilers — Python 3.13.3 documentation https://docs.python.org/3/library/profile.html
37 Primer on Python Decorators – Real Python https://realpython.com/primer-on-python-decorators/
38 typing — Support for type hints — Python 3.13.3 documentation https://docs.python.org/3/library/typing.html
13