Вопросы на собеседовании Python-разработчика: что реально проверяют
Определение из документации знают все. Отсеивает не оно, а уточняющий вопрос следом: «хорошо, а почему тогда потоки ускоряют запросы к API?». Разбираем вопросы по грейдам вместе с этими продолжениями.

Списки вопросов в интернете устроены одинаково: вопрос — определение — дальше. На реальном собеседовании определение это только первый ход. Отсеивает второй: «хорошо, а почему тогда потоки ускоряют запросы к API, если GIL один?»
Поэтому ниже вопросы идут вместе с продолжениями, которые за ними следуют, и с типичными местами, где кандидаты рассыпаются.
Джуниор: базовая модель языка
Изменяемые и неизменяемые типы. Что можно положить ключом в словарь и почему список нельзя.
Продолжение: «А кортеж можно?» Правильный ответ — можно, если внутри нет изменяемых элементов, и это как раз проверяет понимание, а не заученный список типов.
Аргумент по умолчанию. Классика, которую спрашивают почти всегда:
def add(item, target=[]):
target.append(item)
return target
add(1) # [1]
add(2) # [1, 2] — не [2]
Значение по умолчанию вычисляется один раз при определении функции, а не при каждом вызове. Правильное решение — target=None и создание списка внутри.
Продолжение: «Где это ещё стреляет?» — в датаклассах, в кэшах, в конфигах модульного уровня.
is против ==. Тождество объекта против равенства значений.
Продолжение почти всегда такое:
a = 256; b = 256
a is b # True
a = 257; b = 257
a is b # False (в интерактивном режиме)
Мелкие целые числа кэшируются интерпретатором. Кандидат, который знает, почему так, обычно понимает и разницу между объектом и именем.
Списковое включение против генератора. [x*x for x in range(10**7)] съест память, (x*x for x in range(10**7)) — нет.
Продолжение: «А когда генератор хуже?» Когда нужно пройти данные дважды или узнать длину.
*args и **kwargs. Спрашивают ради того, читал ли ты чужой код.
Мидл: как оно работает внутри
GIL. Самый частый вопрос уровня и самый плохо отвечаемый.
Определение: в CPython одновременно байткод исполняет только один поток. Дальше начинается то, ради чего спрашивают.
Продолжение: «Почему тогда потоки помогают на запросах к сети?» — потому что на времени ожидания ввода-вывода GIL освобождается, и другие потоки работают.
Второе продолжение: «А если задача считает числа?» — тогда потоки не помогут, нужны процессы (multiprocessing) или уход в библиотеки, которые считают вне интерпретатора.
Третье, современное: «Что изменилось в последних версиях?» — в 3.13 появилась экспериментальная свободнопоточная сборка без GIL, а в 3.14 этот режим получил официальную поддержку. Знание этого выделяет кандидата: большинство отвечает по статьям пятилетней давности.
Декораторы. Требуют объяснить, а не воспроизвести.
from functools import wraps
def retry(times):
def decorator(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
for attempt in range(times):
try:
return fn(*args, **kwargs)
except ConnectionError:
if attempt == times - 1:
raise
return wrapper
return decorator
Продолжение: «Зачем wraps?» — чтобы не потерять имя, докстринг и сигнатуру обёрнутой функции. Кандидаты, которые пишут декораторы без wraps, обычно копировали их, а не понимали.
Генераторы и yield. Ленивое вычисление, экономия памяти, yield from.
Продолжение: «Что происходит с состоянием функции между вызовами?» Здесь видно, понимает ли человек, что генератор — это приостановленный кадр выполнения, а не хитрый список.
Контекстные менеджеры. with, __enter__, __exit__, contextlib.contextmanager.
Продолжение: «Что будет, если внутри блока исключение?» — __exit__ вызовется всё равно, и это главная причина, по которой конструкция существует.
Исключения. Разница между except и finally, зачем нужен else, почему except Exception: pass — плохо.
Сеньор: производительность и модель памяти
Asyncio. Событийный цикл, корутины, await.
Главное продолжение: «Где asyncio не поможет?» — на вычислительной нагрузке. Один блокирующий вызов внутри корутины останавливает весь цикл, и это самая частая ошибка в реальном коде.
Управление памятью. Подсчёт ссылок плюс сборщик циклических ссылок.
Продолжение: «Что делает __slots__?» — убирает __dict__ у экземпляров, экономя память при большом количестве объектов. Продолжение к продолжению: «А что ломает?» — динамическое добавление атрибутов и часть сценариев с наследованием.
MRO. Порядок разрешения методов и линеаризация C3 при множественном наследовании.
Продолжение: «Как посмотреть?» — Class.__mro__. Вопрос редко про теорию: чаще проверяют, приходилось ли разбирать реальный конфликт наследования.
Типизация. typing, Protocol, что даёт mypy и чего не даёт.
Продолжение: «Влияют ли аннотации на исполнение?» — нет, они не проверяются в рантайме, если не используется отдельная библиотека вроде Pydantic.
Производительность. «Код медленный, что делаешь?»
Правильный ответ начинается не с оптимизации, а с измерения: профилировать, найти горячую точку, проверить сложность алгоритма, посмотреть на количество запросов к базе. Кандидат, который сразу начинает переписывать циклы на списковые включения, показывает отсутствие опыта с реальными узкими местами.
Вопросы, где проверяют не знания
| Вопрос | Что на самом деле смотрят |
|---|---|
| Как бы вы протестировали эту функцию? | понимаете ли, что такое границы и подмена зависимостей |
| Почему в проекте выбрали X, а не Y? | умеете ли объяснять решение, а не защищать его |
| Что бы вы переписали в своём последнем проекте? | есть ли рефлексия |
| Как объясните это джуну? | можете ли излагать просто |
Эти вопросы часто весят больше технических: с ними работают дальше, а конкретный синтаксис доучивается за неделю.
Как готовиться
Не заучивать определения. Половина вопросов выше есть в любом списке, и интервьюеры это знают — поэтому и спрашивают продолжение.
Прогонять реальные формулировки. Вопрос из статьи и вопрос на созвоне звучат по-разному: живьём его задают короче и сразу с продолжением. База вопросов фильтруется по языку и грейду, так что можно прогнать именно свою секцию, а не список вообще.
Проговаривать вслух. Разница между «я это знаю» и «я это объяснил за две минуты» огромная. Возьми пять тем — GIL, генераторы, декораторы, asyncio, память — и расскажи каждую вслух на таймере. Мок-интервью с разбором закрывает именно эту часть.
Готовить примеры из своего кода. На каждую тему — случай из практики. «Мы поймали утечку на замыкании в декораторе» весит больше, чем идеальное определение.
Помнить, что подсказка не спасёт на продолжении. Определение с экрана прочитать можно, а на «почему тогда потоки ускоряют запросы» чтение слышно. Поэтому подсказка полезна как страховка на незнакомой библиотеке, а не как замена подготовке.
Частые вопросы
Какие вопросы задают Python-разработчику на собеседовании?
По грейдам: джуниору — изменяемые и неизменяемые типы, аргументы по умолчанию, is против ==, генераторы; мидлу — GIL, декораторы, контекстные менеджеры, исключения; сеньору — asyncio, модель памяти, MRO, типизация и подход к производительности.
Что спрашивают про GIL?
Сначала определение: в CPython одновременно байткод исполняет только один поток. Дальше — почему потоки всё же ускоряют работу с сетью (GIL освобождается на ожидании ввода-вывода), что делать с вычислительной нагрузкой (процессы) и что изменилось в свежих версиях: в 3.13 появилась экспериментальная сборка без GIL, в 3.14 режим стал официально поддерживаемым.
Почему изменяемый аргумент по умолчанию — ошибка?
Значение по умолчанию вычисляется один раз при определении функции, поэтому список живёт между вызовами и накапливает данные. Правильно передавать None и создавать список внутри функции.
Что отвечать на вопрос «код медленный, что делать»?
Сначала измерить: профилировать, найти горячую точку, проверить алгоритмическую сложность и количество обращений к базе. Ответ, который начинается с переписывания циклов, показывает отсутствие опыта с реальными узкими местами.
Насколько глубоко спрашивают про asyncio?
Обычно достаточно понимания событийного цикла и корутин, но почти всегда спрашивают, где asyncio не помогает: на вычислительной нагрузке и при блокирующем вызове внутри корутины, который останавливает весь цикл.
Как готовиться к техническому собеседованию по Python?
Не заучивать определения, а тренировать продолжения: на каждую тему готовить объяснение вслух и пример из собственного кода. Пять тем — GIL, генераторы, декораторы, asyncio, память — закрывают большую часть вопросов уровня мидл.


