Разбираем реальные вопросы по Python на собеседованиях: что проверяют на самом деле, а что просто тест на память. Готовьтесь эффективно.
Python встречается на собеседованиях повсеместно, потому что он повсеместно используется в работе. В опросе Stack Overflow Developer Survey 2025 57,9% разработчиков сообщили об использовании Python — рост на семь пунктов за год, самый большой скачок среди всех основных языков. Он уступает только JavaScript, HTML/CSS и SQL. Если вы проходите собеседование на программную инженерию, data science, ML или аналитику, экран по Python почти гарантирован.
Эта популярность — причина, по которой типовые списки вопросов вас подводят. Когда тема настолько широка, список из 95 вопросов вынужден оставаться поверхностным, чтобы охватить всё. Вы получаете пятнадцать вариаций на тему «в чём разница между списком и кортежем» и ничего о вопросах, которые действительно разделяют кандидатов: чтение незнакомого кода, отладка под давлением, выбор правильной структуры данных, когда это важно.
Есть и вторая проблема. Интервьюеры знают о существовании таких списков и адаптировались. В опросе interviewing.io 2025 года среди 67 интервьюеров (52 из FAANG) 81% подозревали кандидатов в использовании ИИ для обмана, а 75% считали, что помощь ИИ позволяет слабым кандидатам проходить собеседования, которые они иначе провалили бы. Ответная реакция — больше уточняющих вопросов, больше «проведи меня через то, почему ты это сделал», больше проверки, понимаете ли вы код на экране. Заученный ответ выдерживает первый вопрос и разваливается на втором.
Цель — изучать вопросы, которые развивают переносимое мышление, и выявлять чистые факты, чтобы тратить на факты пять минут вместо пятидесяти.
Каждый вопрос ниже содержит две заметки. Сигнал — что сильный ответ говорит интервьюеру о вашей работе. Скорость обработки данных, инстинкт отладки, идиоматический стиль, знание библиотек, системное мышление. Это причина, по которой вопрос задают, даже если интервьюер не может её сформулировать. Фактологический налог — флаг, когда вопрос в основном вознаграждает за то, что вы его уже видели. Такие вопросы всё ещё задают, поэтому ответы знать нужно, но их заучивание не учит ничему полезному для настоящего кода. Учите быстро и двигайтесь дальше.
Чтобы внести ясность: оценки сигнала и фактологического налога здесь — редакционное суждение, основанное на опыте проведения собеседований, а не результат формального исследования. Там, где я привожу цифры, они взяты из названных публичных источников со ссылками. Примеры вопросов взяты из реальных собеседований и из банка практических вопросов Four-Leaf.
Здесь интервьюеры проверяют, пишете ли вы на Python или пишете на каком-то другом языке, используя синтаксис Python. Вопросы выглядят базовыми. Сигнал — в том, насколько идиоматичен ваш ответ.
Списки изменяемы, кортежи неизменяемы и хешируемы, поэтому кортежи могут быть ключами словаря и элементами множества, а списки — нет. «Когда» важнее, чем «что»: кортежи сигнализируют о фиксированной записи (координата, строка), списки — о растущей коллекции.
Сигнал: думаете ли вы об изменяемости как о проектном решении, а не просто свойстве.
Фактологический налог: частичный. Определение — зубрёжка, но «когда что использовать» превращает его в реальный вопрос.
Оно строит список в одном выражении: [x * 2 for x in nums if x > 0]. Сильный ответ включает «не»: не используйте включения, когда логика требует нескольких операторов или побочных эффектов, и не стройте полный список, когда выражение-генератор может лениво передавать значения.
Сигнал: идиоматический стиль плюс суждение о памяти. Кандидат, который знает включения, но не знает, когда остановиться, напишет нечитаемые вложенные конструкции.
*args собирает лишние позиционные аргументы в кортеж, **kwargs собирает лишние именованные аргументы в словарь. Они используются для функций, которые передают аргументы дальше или принимают гибкую сигнатуру.
Сигнал: низкий сам по себе. Важен с уточняющим вопросом: напишите декоратор, работающий с любой функцией, что заставляет реально использовать оба.
Фактологический налог: да, изолированно. Знайте наизусть, не тратьте время.
Декоратор — это функция, которая принимает функцию и возвращает новую функцию, используется для обёртывания поведения (тайминг, логирование, кеширование) без изменения исходной. Чистый ответ использует functools.wraps для сохранения имени и докстринга обёрнутой функции.
import functools
import time
def timed(fn):
@functools.wraps(fn)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = fn(*args, **kwargs)
print(f"{fn.__name__} took {time.perf_counter() - start:.4f}s")
return result
return wrapper
Сигнал: высокий. Декораторы находятся на пересечении замыканий, функций первого класса и *args/**kwargs. Кандидат, который пишет их чисто, понимает многое в Python одновременно. Деталь с functools.wraps отличает тех, кто выкатывал декораторы в прод, от тех, кто только читал о них.
== сравнивает значения, is сравнивает идентичность (указывают ли два имени на один и тот же объект). Ловушка — интернирование маленьких целых чисел и строк, где a is b может быть True для 256, но False для 257.
Сигнал: понимаете ли вы, что переменные — это ссылки на объекты. Интернирование — отвлекающий манёвр.
Фактологический налог: граничный случай интернирования — чистая фактология. Понимание модели ссылок под ним — нет.
Значение по умолчанию вычисляется один раз, при определении функции, поэтому def f(x, acc=[]) разделяет один список между всеми вызовами. Исправление: acc=None, затем acc = acc or [] внутри тела.
Сигнал: высокий и недооценённый. Это реальная ошибка, которая попадает в продакшн. Кандидат, который с ней столкнулся, написал достаточно Python, чтобы обжечься, — именно такой опыт интервьюеры и проверяют.
Генератор лениво выдает значения через yield, удерживая в памяти только одно значение за раз вместо построения всей последовательности. Они используются для обработки больших или бесконечных потоков без загрузки всего сразу.
Сигнал: осознание памяти и понимание ленивости. Кандидаты, которые используют генераторы для задачи «обработать этот 10ГБ файл», показывают реальный инстинкт.
Глобальная блокировка интерпретатора (GIL) означает, что только один поток выполняет байт-код Python в любой момент времени, поэтому потоки не ускоряют CPU-ёмкие задачи. Для I/O-ёмких задач потоки всё ещё полезны (GIL отпускается во время ожидания I/O), а для параллелизма CPU-bound используйте multiprocessing или нативные расширения.
Сигнал: высокий для бэкенд-ролей. Уточняющий вопрос «когда вообще использовать потоки» отделяет тех, кто запомнил «GIL плох», от тех, кто понимает случай I/O-bound.
Обычные методы принимают self, методы класса принимают cls и могут конструировать или настраивать класс, статические методы не принимают ни то, ни другое и являются просто функциями в пространстве имён класса. Методы класса — идиоматический способ написания альтернативных конструкторов.
Сигнал: умеренный. Использование classmethod для альтернативных конструкторов — часть, показывающая настоящее владение ООП.
Фактологический налог: частичный. Определения — зубрёжка, «когда использовать classmethod» — нет.
Он защищает код, который должен выполняться только при прямом запуске файла, а не при импорте как модуля. Без него побочные эффекты скрипта сработают при импорте.
Сигнал: низкий. Полезная идиома, но знание её почти ничего не говорит об инженерных способностях.
Фактологический налог: да. Один из самых переспрашиваемых вопросов по Python. Знайте односложный ответ, двигайтесь дальше.
Поверхностная копия дублирует внешний объект, но делит ссылки на вложенные объекты, поэтому изменение вложенного списка отражается в обеих копиях. copy.deepcopy рекурсивно дублирует всё.
Сигнал: умеренный. Связан с моделью ссылок и реальным классом ошибок. Кандидаты, которые отлаживали ошибку общего вложенного объекта, отвечают убедительно.
Здесь язык менее важен, чем рассуждения, но Python-специфичные инструменты (dict, set, collections, heapq, срезы) — именно то, что интервьюеры хотят видеть в вашем арсенале. Решение с правильным инструментом из стандартной библиотеки само по себе сигнал.
Рекурсия: если элемент — список, рекурсивно зайти в него, иначе добавить. Используйте isinstance(item, list), а не type(item) == list, чтобы работали подклассы.
Сигнал: чистая рекурсия и деталь с isinstance. Деталь мала, но это инстинкт корректности, который проявляется везде в реальном коде.
Посчитать частоты символов; палиндром допускает не более одного символа с нечётным количеством. collections.Counter плюс один проход по счётчикам.
Сигнал: используете ли вы Counter вместо ручного построения словаря частот. Изобретать Counter заново — не грех, но это говорит интервьюеру, что вы плохо знаете стандартную библиотеку.
Скользящее окно со счётчиком «не хватает»: расширяйте правую границу, пока окно не станет валидным, затем сжимайте слева, отслеживая лучшее окно. Это сложный вопрос, и интервьюеры это знают.
Сигнал: высокий. Скользящее окно — один из самых ценных паттернов для усвоения, потому что он переносится на десятки задач. Получить условие сжатия под давлением — сильный сигнал.
В Python короткий путь — collections.OrderedDict с move_to_end при доступе и popitem(last=False) при вытеснении. Более глубокий ответ — хеш-карта плюс двусвязный список, что вы написали бы, если бы попросили сделать без стандартной библиотеки.
Сигнал: высокий, и это отличный вопрос именно потому, что у него две допустимые высоты. Знание трюка с OrderedDict показывает владение Python; способность опуститься до связного списка показывает, что вы понимаете, почему это O(1).
Алгоритм Кана: вычислите входящие степени, начните с узлов с нулевой степенью и уменьшайте степени соседей по мере удаления узлов. Если не удаётся обработать все узлы, есть цикл.
Сигнал: графовое мышление и понимание обнаружения циклов. Встречается чаще, чем ожидается, потому что упорядочивание зависимостей — реальная проблема (системы сборки, планировщики задач).
Сканируйте сетку; на каждой непосещённой ячейке суши увеличьте счётчик и выполните заливку (DFS или BFS), чтобы пометить связную область. Мутация посещённых ячеек на месте избавляет от отдельного множества visited.
Сигнал: высокий. Проверяет, можете ли вы реализовать DFS/BFS чисто и осознать, что мутация входных данных допустима (если не оговорено иное).
Не пытайтесь выучить все 95 вопросов. Сосредоточьтесь на тех, которые дают высокий сигнал: декораторы, изменяемые аргументы по умолчанию, генераторы, скользящее окно, LRU-кеш. Для вопросов с фактологическим налогом (__name__, is vs ==, *args/**kwargs) запомните односложный ответ и потратьте сэкономленное время на практику с реальными задачами.
Лучший способ подготовиться — писать код под таймером. Откройте LeetCode или аналогичную платформу, выберите задачу средней сложности и решите её за 20 минут, комментируя свои мысли вслух. Это имитирует реальное собеседование и строит переносимые навыки, которые останутся с вами, даже если вопросы изменятся.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →