Это собеседование Python Backend-разработчика уровня примерно Junior+/Middle. Компания не названа. Интервью проверяет модель объектов Python, ООП, сеть, базы данных, декораторы и генераторы.
Какие объекты в Python изменяемые
Короткий ответ: список, словарь и множество можно менять на месте; число, строка и кортеж неизменяемы.
Переменная в Python не является коробкой со значением. Она связывает имя с объектом. Если два имени ссылаются на один список, изменение через одно имя будет видно через другое.
Кортеж нельзя изменить по индексу, но вложенный список внутри него остаётся изменяемым. Поэтому корректный ответ учитывает не только внешний контейнер.
Чем is отличается от ==
Короткий ответ: == сравнивает значения, а is проверяет, один ли это объект.
Для None принято писать value is None, потому что нас интересует конкретный объект-одиночка. Для строк и чисел используют ==. Оптимизации интерпретатора иногда заставляют равные литералы указывать на один объект, но полагаться на это нельзя.
Типичная ошибка. Доказывать, что is подходит для сравнения строк или чисел, потому что короткий пример случайно вернул True. Это деталь реализации интерпретатора, а не контракт языка.
Как лучше. Сформулируйте правило через смысл операции: == сравнивает значения, is — идентичность объектов. Затем покажите два равных списка как контрпример случайному запоминанию результата.
first = [1, 2]
second = [1, 2]
# Значения списков равны.
assert first == second
# Но это два разных объекта.
assert first is not secondЧем отличаются методы экземпляра, класса и статические методы
Короткий ответ: обычный метод работает с экземпляром через self, classmethod получает класс через cls, staticmethod не получает их автоматически.
classmethod полезен для альтернативных конструкторов и логики, которая зависит от конкретного класса, включая наследников. staticmethod — обычная функция, логически помещённая в пространство имён класса.
Защищённое имя с одним подчёркиванием — соглашение для внутреннего использования. Двойное подчёркивание включает преобразование имени, но не создаёт настоящую защиту доступа.
Как связаны HTTP, TCP и UDP
Короткий ответ: HTTP задаёт формат и смысл веб-запросов, а TCP и UDP работают ниже и передают данные между узлами.
TCP устанавливает соединение, сохраняет порядок и повторно передаёт потерянные данные. UDP отправляет отдельные датаграммы без таких гарантий, зато с меньшими накладными расходами.
HTTP задаёт смысл запроса и ответа, а TCP и IP отвечают за доставку данных на нижних уровнях. Источник: MDN Web Docs.
HTTPS — это HTTP поверх защищённого TLS-соединения. На интервью полезно объяснить путь запроса: DNS находит адрес, транспорт устанавливает связь, TLS защищает канал, сервер принимает HTTP-запрос и формирует ответ.
Методы HTTP имеют разную семантику. GET читает, POST обычно создаёт или запускает действие, PUT заменяет ресурс, PATCH частично меняет, DELETE удаляет.
Как работает составной индекс
Короткий ответ: порядок столбцов важен, и индекс должен соответствовать фильтрации, соединению и сортировке реальных запросов.
Индекс по (user_id, created_at) хорошо помогает искать записи конкретного пользователя и ограничивать дату. Запрос только по created_at часто не использует такой индекс эффективно, потому что первый столбец не задан.
Индекс ускоряет чтение не бесплатно: он занимает место и обновляется при записи. Решение принимают после анализа запроса через EXPLAIN ANALYZE, а не по одному названию поля.
Как написать простой декоратор кэширования
Короткий ответ: сохранить результат в словаре по хешируемому набору аргументов и вернуть сохранённое значение при повторе.
from functools import wraps
def cached(function):
# Кэш принадлежит конкретной обёрнутой функции.
storage = {}
@wraps(function)
def wrapper(*args, **kwargs):
# Сортируем именованные аргументы, чтобы порядок не менял ключ.
key = (args, tuple(sorted(kwargs.items())))
# Вычисляем результат только при первом обращении.
if key not in storage:
storage[key] = function(*args, **kwargs)
return storage[key]
return wrapperТакой учебный вариант требует хешируемых аргументов, не ограничивает размер и не учитывает срок жизни результата. В рабочем коде чаще используют functools.lru_cache или специализированное хранилище.
Чем итератор отличается от генератора
Короткий ответ: итератор следует протоколу __iter__ и __next__, а генератор создаёт такой объект функцией с yield.
Генератор лениво вычисляет значения и сохраняет своё состояние между шагами. Это удобно для больших последовательностей, но после полного прохода тот же генератор исчерпан.
Контекстный менеджер решает другую задачу: гарантирует вход и выход из контекста, например открытие и закрытие файла. Не стоит объединять эти понятия только потому, что оба используют специальные методы Python.
Получил бы кандидат оффер
Короткий ответ: скорее да.
Кандидат хорошо отвечал о коллекциях, ссылках, индексах и справился с кодом. Неуверенность в типизации и назначении classmethod была заметна, но выглядела как локальный пробел, а не отсутствие базы.
Закрыть такие пробелы помогает тренажёр собеседований ЮНИКОД: он строит подготовку по конкретным темам и уточняющим вопросам.
Источники
частые вопросы
Короткие ответы
Можно ли подготовиться по списку вопросов с собеседования?
Да, если использовать список как диагностику, а не как набор фраз для запоминания. Сгруппируйте вопросы по темам, восстановите механизм, напишите пример и потренируйте уточнения.
Какие темы Python нужно повторить в первую очередь?
Начните с объектов и ссылок, изменяемости, коллекций, функций, исключений, итераторов и классов. Для Backend добавьте HTTP, SQL, транзакции и устройство веб-запроса.
Нужно ли помнить все методы и определения наизусть?
Базовые понятия и часто используемый синтаксис лучше знать без поиска. Редкие детали можно сверять с документацией, если вы способны объяснить общую модель и быстро проверить точность.


