Собеседование Python: вопросы и мок с ИИ
Голосовое мок-собеседование для Python-разработчиков, которые готовятся к позициям junior, middle или senior. ИИ-интервьюер задаёт вопросы на собеседовании Python, как в реальных командах: от мутабельности и генераторов до GIL, asyncio и типизации, а затем оценивает каждый ответ по технической точности, полноте и ясности. Выберите Python как технологию или загрузите резюме либо описание вакансии, чтобы получить вопросы под конкретную роль.
Что проверяет собеседование по Python
Модель данных и мутабельность
Изменяемые и неизменяемые типы, identity против equality, хешируемость и dunder-методы вроде __eq__, __hash__, __repr__. Ждите уточнений про мутабельные аргументы по умолчанию и поверхностное и глубокое копирование.
Итераторы и генераторы
Протокол итератора, ленивые вычисления через yield и генераторные выражения, yield from и когда генератор лучше списка в памяти.
Декораторы и контекстные менеджеры
Замыкания, декораторы с аргументами, functools.wraps, управление ресурсами через __enter__/__exit__ или contextlib.contextmanager.
Конкурентность, GIL и asyncio
Когда брать threading, multiprocessing или asyncio, что на самом деле блокирует GIL и что меняют free-threaded сборки (экспериментальные в 3.13, официально поддерживаются с 3.14).
Управление памятью
Подсчёт ссылок, циклический сборщик мусора, типичные причины утечек, __slots__ и профилирование памяти через tracemalloc.
Аннотации типов
Дженерики с синтаксисом параметров типов 3.12+, Protocol против ABC, TypedDict и как встроить mypy или pyright в проект без лишнего трения.
Инструменты, упаковка и тесты
pyproject.toml, виртуальные окружения, uv, ruff и lock-файлы, а также фикстуры pytest, параметризация и моки на правильной границе.
Django и FastAPI
Запросы через ORM и проблема N+1 в Django, внедрение зависимостей и валидация Pydantic в FastAPI, синхронная и асинхронная обработка запросов.
Вопросы на собеседовании Python: junior, middle, senior
Junior
Чем список отличается от кортежа и почему кортеж может быть ключом словаря?
Что должно быть в сильном ответе:Список изменяемый, кортеж — нет, поэтому кортежи удобны для фиксированных записей. Ключ словаря должен быть хешируемым, а кортеж хешируем, только если хешируемы все его элементы: (1, 2) подходит, а кортеж со списком внутри — нет. Список не может быть ключом, потому что его содержимое, а значит и хеш, может измениться.
Что не так с мутабельным аргументом по умолчанию, например def f(items=[])?
Что должно быть в сильном ответе:Значение по умолчанию вычисляется один раз, при определении функции, поэтому все вызовы без аргумента делят один и тот же список и изменения накапливаются. Стандартное решение — None по умолчанию и создание нового списка внутри функции. Сильный ответ объясняет причину, а не только обходной путь.
В чём разница между is и ==?
Что должно быть в сильном ответе:== сравнивает значения через __eq__, а is проверяет, один ли это объект. is используют для синглтонов вроде None, == — для всего остального. Стоит упомянуть, что CPython кеширует маленькие целые числа и некоторые строки, поэтому is иногда «работает», но полагаться на это — баг.
Что означают *args и **kwargs в сигнатуре функции?
Что должно быть в сильном ответе:*args собирает лишние позиционные аргументы в кортеж, **kwargs — именованные аргументы в словарь. Те же операторы распаковывают последовательности и словари при вызове. Плюс, если упомянете keyword-only параметры после * и positional-only параметры до /.
Чем list comprehension отличается от генераторного выражения?
Что должно быть в сильном ответе:List comprehension сразу строит весь список в памяти, а генераторное выражение выдаёт элементы лениво, по одному. Генератор экономит память на больших или бесконечных последовательностях, но пройти его можно только один раз. Список нужен, когда требуется индексация, длина или несколько проходов.
Middle
Как работает декоратор и как написать декоратор с аргументами?
Что должно быть в сильном ответе:Декоратор — это callable, который принимает функцию и возвращает замену, обычно замыкание-обёртку; @dec — это просто f = dec(f). Декоратор с аргументами — это фабрика: внешняя функция принимает параметры и возвращает сам декоратор. functools.wraps сохраняет имя, docstring и метаданные исходной функции.
Объясните протокол итератора и как его реализуют генераторы.
Что должно быть в сильном ответе:Iterable имеет __iter__, возвращающий итератор; итератор имеет __next__ и бросает StopIteration, когда элементы закончились. Генераторная функция возвращает объект-генератор, который реализует оба метода и сохраняет состояние между yield. Упомяните yield from для делегирования подгенератору и то, что цикл for под капотом вызывает iter() и next().
Как работают контекстные менеджеры и когда стоит писать свой?
Что должно быть в сильном ответе:with вызывает __enter__ на входе и __exit__ на выходе, даже если возникло исключение; __exit__ получает детали исключения и может подавить его, вернув True. contextlib.contextmanager позволяет написать менеджер как генератор с одним yield в try/finally. Типичные случаи — локи, транзакции, временные файлы, замеры времени.
Когда выбрать threading, multiprocessing, а когда asyncio?
Что должно быть в сильном ответе:В стандартной сборке CPython GIL позволяет выполнять байткод Python только одному потоку за раз, поэтому потоки помогают с I/O-задачами, но не с CPU-задачами. multiprocessing обходит GIL отдельными процессами ценой памяти и сериализации. asyncio обрабатывает много I/O-задач в одном потоке, но требует асинхронных библиотек, а любой блокирующий вызов останавливает весь event loop.
Как структурировать тесты на pytest для кода, который обращается к внешнему API?
Что должно быть в сильном ответе:Спрячьте API за небольшим клиентом и мокайте именно эту границу, а не внутренности сторонних библиотек. Фикстуры — для подготовки и очистки, parametrize — для граничных случаев без копипаста, monkeypatch или unittest.mock — для клиента. Несколько интеграционных тестов против sandbox или записанных ответов ловят изменения контракта.
Senior
Каково состояние GIL сейчас и что меняет free-threaded Python?
Что должно быть в сильном ответе:PEP 703 добавил опциональную сборку без GIL: в 3.13 она была экспериментальной, в 3.14 стала официально поддерживаемой, но не по умолчанию. Она даёт параллельное выполнение CPU-задач в потоках, однако однопоточный код может быть несколько медленнее, а C-расширения нужно пересобрать и пометить совместимыми, иначе GIL может включиться во время выполнения. Сильный ответ добавляет: отсутствие GIL не делает ваш код потокобезопасным, общее изменяемое состояние всё равно требует локов.
Как CPython управляет памятью и как искать утечку памяти?
Что должно быть в сильном ответе:Большинство объектов освобождается сразу благодаря подсчёту ссылок, а циклические ссылки убирает циклический сборщик мусора. На практике утечки дают глобальные кеши, неограниченный lru_cache, ссылки в замыканиях или подписчиках, либо C-расширения. Сравнивайте снимки tracemalloc во времени, используйте objgraph или memray, а для большого количества мелких объектов — __slots__ или weakref.
Что такое дескрипторы и как на них опираются property и методы?
Что должно быть в сильном ответе:Дескриптор — объект с __get__ и, при необходимости, __set__ или __delete__, который хранится как атрибут класса. Data-дескрипторы имеют приоритет над __dict__ экземпляра, non-data — нет, поэтому property перехватывает присваивание, а обычный метод можно затенить. Функции — это non-data дескрипторы, и именно их __get__ создаёт связанные методы.
Как не блокировать event loop в asyncio-сервисе и как управлять жизнью задач?
Что должно быть в сильном ответе:Для I/O берите асинхронные клиенты, а неизбежную блокирующую или CPU-тяжёлую работу выносите в asyncio.to_thread или пул процессов через run_in_executor. Для структурированной конкурентности используйте asyncio.TaskGroup (3.11+): ошибка отменяет соседние задачи, и ничего не остаётся без присмотра. Корректно обрабатывайте отмену — очистка в finally, не глотать CancelledError, таймауты через asyncio.timeout.
Когда использовать typing.Protocol вместо абстрактного базового класса?
Что должно быть в сильном ответе:ABC — номинальная типизация: класс должен явно наследоваться, а абстрактные методы проверяются при создании экземпляра. Protocol — структурная типизация: любой класс с нужными методами подходит для тайпчекера, что удобно для сторонних типов и слабой связанности. По умолчанию Protocol проверяется статически; runtime_checkable даёт isinstance, но проверяет только наличие методов, не сигнатуры.
Как проходит мок-собеседование по Python
- Выберите Python (и другие технологии из своего стека), свой уровень и язык собеседования: украинский, английский или русский. Или загрузите резюме и описание вакансии.
- Отвечайте на каждый вопрос голосом, как на настоящем собеседовании.
- Получите оценку каждого ответа по точности, полноте и понятности и отчёт со слабыми местами.
Как отвечать на вопросы по Python вслух
- →Начните с определения в одно предложение, затем объясните механизм, затем приведите маленький пример. Структуру оценивают не меньше, чем факты.
- →Называйте версию Python, когда это важно: порядок ключей dict (3.7+), match (3.10+), TaskGroup (3.11+), free-threaded сборки (3.13+). Это показывает, что вы следите за языком.
- →Описывайте код словами, а не диктуйте синтаксис: «декоратор, который оборачивает функцию и повторяет вызов при ошибке», а не каждую скобку и двоеточие.
- →Всегда называйте компромисс: потоки против процессов, генераторы против списков, ABC против Protocol. Сказать, когда вы бы это НЕ использовали, — сильный сигнал.
- →Привязывайте ответы к реальной работе: утечка, найденная через tracemalloc, N+1 в Django, нестабильный тест, который вы починили. Конкретика сильнее учебника.
Частые вопросы
Нужно ли писать код на мок-собеседовании по Python?
Нет. Вопросы устные, вы отвечаете голосом, редактора для live coding нет. Вы объясняете концепции, компромиссы и подход к задаче — так же, как на техническом скрининге.
Можно ли тренировать Django или FastAPI вместе с Python?
Да. Django и FastAPI можно выбрать как технологии вместе с Python, и собеседование совместит вопросы по языку и по фреймворку. Также можно загрузить описание вакансии, чтобы вопросы соответствовали конкретной роли.
Подойдёт ли это опытным Python-разработчикам?
Да. Выберите уровень senior, чтобы получить вопросы про GIL и free-threading, управление памятью, дескрипторы, асинхронную архитектуру и типизацию. Каждый ответ оценивается по технической точности, полноте и ясности.
Сколько это стоит?
Первое собеседование до 5 вопросов бесплатно. Дальше — оплата за каждое собеседование от $1.75, без подписки. В одном собеседовании может быть до 50 вопросов.