На собеседовании Python Backend-разработчика в МТС начали с коллекций и аргументов функций, затем перешли к устройству set и dict, итераторам, ООП и архитектурной задаче. Такой порядок быстро показывает, понимает ли кандидат язык под синтаксисом и умеет ли применять знания в работающем сервисе.
Чем список отличается от кортежа и строки
list, tuple и str — последовательности, но ведут себя по-разному. Список изменяем: можно заменить элемент, добавить или удалить значение. Кортеж и строка неизменяемы: операция создаёт новый объект, а не меняет существующий.
Кортеж удобно использовать для фиксированной записи или хэшируемого составного ключа, если все его элементы тоже хэшируемы. Список подходит для набора, который меняется. Формулировка «кортеж всегда быстрее» слишком общая: выбор структуры определяет смысл данных, а не небольшой выигрыш в конкретной операции. Основные операции последовательностей описаны в документации Python.
Что такое *args и **kwargs
*args собирает дополнительные позиционные аргументы в кортеж, а **kwargs — именованные в словарь. Названия args и kwargs приняты по соглашению; специальный смысл имеют звёздочки.
def build_event(event_name: str, *tags: str, **fields: object) -> dict:
# tags приходит кортежем, а fields — словарём именованных полей.
return {
"event": event_name,
"tags": list(tags),
"fields": fields,
}
event = build_event("purchase", "mobile", price=990, currency="RUB")
print(event)Сильный ответ дополняют распаковкой: func(*values, **options). При объявлении функции порядок параметров важен; полные правила приведены в разделе Function definitions.
Как убрать дубли и сохранить порядок
list(set(values)) удаляет повторы коротко, но предъявляет два условия: все элементы должны быть хэшируемыми, а исходный порядок не следует считать частью общего контракта set. Если порядок первого появления важен, используем ключи словаря:
def unique_in_order(values: list[str]) -> list[str]:
# dict сохраняет порядок добавления ключей и отбрасывает повторные ключи.
return list(dict.fromkeys(values))
technologies = ["Python", "Django", "Python", "PostgreSQL"]
print(unique_in_order(technologies))
# ['Python', 'Django', 'PostgreSQL']Для списков внутри списка этот способ тоже не сработает: вложенные списки нехэшируемы. Тогда нужен собственный ключ, преобразование в кортеж либо линейная проверка с понятной ценой.
Как устроены set, dict, итератор и генератор
dict хранит пары ключ—значение, а set — только уникальные элементы. Обе структуры используют хэширование, поэтому поиск в среднем занимает O(1), но качество хэша и коллизии влияют на реальную работу. Требования к __hash__ и __eq__ закреплены в модели данных Python.
Итерируемый объект умеет вернуть итератор через __iter__(). Итератор выдаёт элементы методом __next__(). Генератор создаёт итератор проще: функция с yield приостанавливает выполнение и сохраняет локальное состояние. Это удобно для больших потоков данных, но генератор обычно обходят один раз.
Как отвечать про ООП, метаклассы и паттерны
Python поддерживает объектно-ориентированный, процедурный и функциональный стили. Метакласс создаёт и настраивает классы так же, как класс создаёт экземпляры; по умолчанию эту роль выполняет type. Для обычной бизнес-логики метакласс нужен редко, поэтому лучше привести реальный сценарий — регистрацию классов или проверку их определения — и не выдавать его за повседневный инструмент.
Паттерн проектирования раскрывают по формуле «проблема → решение → цена». Например, Strategy позволяет менять алгоритм за единым интерфейсом, но добавляет объекты и связи. Декоратор-функция принимает вызываемый объект и возвращает замену с дополнительным поведением; он не требует изменения исходной функции.
Что делать при замедлении внешнего сервиса
Сначала нужно подтвердить проблему метриками: выросло ли время ответа, какой процент запросов затронут и где начинается задержка. Затем ограничить последствия:
- Поставить разумный тайм-аут.
- Делать ограниченные повторы с задержкой только для безопасных операций.
- Использовать кэш или запасной ответ, если данные допускают устаревание.
- Открывать Circuit Breaker после серии сбоев, чтобы не перегружать зависимость.
- Показать пользователю честное состояние и наблюдать восстановление.
Circuit Breaker временно блокирует обращения к неработающей зависимости и позже проверяет, восстановилась ли она. Это не просто кэш: паттерн управляет состоянием вызовов и защищает систему от каскадного отказа.
Итог: получил бы кандидат оффер
Фактический результат встречи не опубликован. Кандидат скорее прошёл бы технический этап: уверенно отвечал по коллекциям, хэш-таблицам, аргументам и паттернам, а в ситуационной задаче предложил диагностику и кэширование. Для окончательного Middle-решения мы бы проверили код, работу с БД, конкурентность и способность довести архитектурный ответ до конкретных тайм-аутов, метрик и компромиссов.
Источники
частые вопросы
Короткие ответы
Какие коллекции Python чаще проверяют на Backend-собеседовании?
List, tuple, dict и set: их изменяемость, хэшируемость, порядок, среднюю сложность операций и подходящие сценарии использования.
Нужно ли учить все паттерны проектирования?
Нет. Лучше глубоко знать несколько применявшихся паттернов и объяснять задачу, реализацию, пользу и цену каждого решения.
Что делать, если не помните точный термин?
Опишите механизм и ограничения своими словами, задайте уточняющий вопрос и не придумывайте определение. Рабочее рассуждение полезнее уверенной ошибки.


