Назад к материалам

Видео + статья / Собеседования

Собеседование Python-разработчика: 11 вопросов и ответов

Разбираем 11 вопросов с Python-собеседования: tuple и list, dunder-методы, Git, Django ORM, GIL, ACID, изоляцию транзакций и задачу на палиндром.

Опубликовано
Обновлено
Видео вышло
Видео
10:00
Текст
9 минут

Если ролик не загружается, выберите другую площадку.

Смотреть на

В исходном материале собраны вопросы с реального собеседования Python backend-разработчика. Это не полная запись диалога: мы видим список тем и подготовленные ответы, но не все уточнения интервьюера. Поэтому ниже разбираем сами вопросы, исправляем важные упрощения и отделяем подтверждённый результат от нашей оценки.

В чём преимущество tuple перед list?

Короткий ответ: tuple неизменяем, а list можно менять. Поэтому кортеж подходит для фиксированной структуры данных, а список — для коллекции, которая растёт, сокращается или обновляется.

Не стоит говорить, что любой кортеж можно положить в set или использовать как ключ словаря. Он хешируем только тогда, когда хешируем каждый элемент. ("python", 3) подходит, а ("python", []) — нет, потому что внутри находится список.

Разница в памяти и скорости существует в конкретной реализации Python, но это второй слой ответа. Сначала объясните семантику: если набор не должен меняться, кортеж делает это намерение явным.

Какие методы создают объект и как устроена инкапсуляция?

Короткий ответ: __new__ создаёт экземпляр, а __init__ инициализирует уже созданный объект. Одинарное подчёркивание обозначает внутренний атрибут по соглашению, двойное запускает преобразование имени.

В обычном классе редко требуется переопределять __new__. Это бывает полезно для неизменяемых типов или контроля создания экземпляров. В модели данных Python прямо указано: __new__ возвращает новый экземпляр, после чего обычно вызывается __init__.

Имя _token означает «не использовать снаружи без причины». Имя __token внутри Account преобразуется примерно в _Account__token, что защищает от случайного совпадения в наследнике. Это не механизм безопасности: технически атрибут всё равно доступен.

Чем merge отличается от rebase в Git?

Короткий ответ: merge создаёт объединение линий разработки, а rebase переносит коммиты ветки на новое основание и создаёт для них новые идентификаторы.

merge сохраняет реальную форму истории и безопасен для общей ветки. rebase делает линейную историю удобнее для чтения, но опубликованные коммиты после него расходятся с копиями коллег. Поэтому практическое правило простое: свою локальную ветку можно привести в порядок через rebase; общую историю без договорённости не переписывают.

Схема переноса коммитов при rebase

После rebase коммиты ветки получают новое основание. Источник: официальная книга Pro Git.

Короткий ответ: select_related использует SQL JOIN для ForeignKey и OneToOne; prefetch_related делает дополнительные запросы и связывает результаты в Python; proxy model использует ту же таблицу, но меняет поведение модели.

Например, список заказов с каждым автором удобно получить через Order.objects.select_related("author"). Теги заказа или обратную коллекцию лучше загружать через prefetch_related, потому что один JOIN размножил бы строки. Документация Django QuerySet подробно разделяет эти механизмы.

Proxy model не позволяет добавить поле в таблицу. Зато через неё можно задать другой менеджер, сортировку или методы для того же набора строк. Это удобно, когда данным нужна новая модель поведения без новой схемы хранения.

Когда потоки полезны несмотря на GIL?

Короткий ответ: в обычной сборке CPython один поток одновременно исполняет байткод Python, но во время ожидания сети, файла или базы другой поток может продолжить работу.

Поэтому потоки полезны для I/O-bound задач: параллельных HTTP-запросов, чтения файлов, работы с сокетами. Для тяжёлых вычислений на Python чаще используют процессы, векторизованные библиотеки или нативные расширения, которые могут освобождать GIL.

У современного Python есть и свободнопоточная сборка, где GIL отключён. На интервью важно назвать версию и окружение: ответ «потоки никогда не работают параллельно» уже слишком категоричен.

Что такое ACID и уровни изоляции?

Короткий ответ: ACID — это атомарность, согласованность, изоляция и долговечность транзакции. Уровень изоляции определяет, какие результаты параллельных транзакций может увидеть операция.

  • Atomicity: выполняются все изменения транзакции или ни одно.
  • Consistency: подтверждённая транзакция сохраняет заданные ограничения данных.
  • Isolation: параллельные операции не должны приводить к недопустимому наблюдаемому результату.
  • Durability: после подтверждения результат переживает сбой в рамках гарантий СУБД.

Не переносите поведение уровней из одной базы в другую. Например, в PostgreSQL Read Uncommitted работает как Read Committed, а его Repeatable Read не допускает фантомных чтений, хотя стандарт SQL описывает минимальные гарантии иначе. Serializable даёт самый строгий результат, но транзакция может завершиться ошибкой сериализации — приложение должно уметь повторить её. Это зафиксировано в документации PostgreSQL.

Как решить задачу на палиндром?

Короткий ответ: сначала уточните, учитываем ли регистр, пробелы и знаки, затем нормализуйте строку и сравните её с разворотом.

Пример кодаPython
def is_palindrome(text: str) -> bool:
    # Оставляем только буквы и цифры, чтобы пробелы и знаки не мешали проверке.
    cleaned = "".join(char for char in text.casefold() if char.isalnum())

    # Срез с шагом -1 создаёт строку в обратном порядке.
    return cleaned == cleaned[::-1]


# Проверяем обычный случай, смешанный регистр и пустой результат после очистки.
assert is_palindrome("А роза упала на лапу Азора")
assert is_palindrome("Level")
assert is_palindrome("...")

Здесь casefold() надёжнее lower() для сравнения Unicode-текста. После кода проговорите сложность: нормализация и разворот занимают линейное время и дополнительную память. Если интервьюер запретит копию строки, предложите два указателя и пропуск незначащих символов.

Итог: получил ли кандидат оффер?

Что известно: заголовок и вступление исходного материала сообщают об оффере с доходом 260 тысяч рублей. Полного решения работодателя, состава дохода и условий предложения в записи нет.

Наша редакционная оценка: набор тем соответствует уверенной проверке Python backend. Получить положительный результат можно, если кандидат не просто воспроизводит эти формулировки, а выдерживает уточнения по Django ORM, поведению конкретной СУБД и пишет рабочий код.

Перед интервью ответьте на каждый вопрос за 60–90 секунд, затем попросите собеседника сделать условие сложнее. Для системной практики используйте тренажёр собеседований ЮНИКОД: там проще увидеть темы, которые кажутся знакомыми, но распадаются на первом уточнении.

Источники

частые вопросы

Короткие ответы

Чем tuple отличается от list в Python?

Tuple — неизменяемая последовательность, list — изменяемая. Кортеж можно использовать как ключ словаря только тогда, когда все его элементы тоже хешируемы.

Когда выбирать select_related, а когда prefetch_related?

select_related подходит для ForeignKey и OneToOne и получает связанные объекты через JOIN. prefetch_related делает отдельные запросы и удобен для many-to-many и обратных связей.

Работают ли потоки Python параллельно?

Потоки хорошо перекрывают ожидание ввода-вывода. Для Python-кода, нагружающего CPU, обычная сборка CPython ограничена GIL; возможны процессы, нативный код и свободнопоточная сборка.

Как проверить знания перед Python-собеседованием?

Отвечайте вслух, добавляйте по одному ограничению и примеру, а код пишите без подсказок. В тренажёре ЮНИКОД можно повторить вопросы и увидеть слабые темы.

следующий шаг

Отработайте Python-вопросы до собеседования

Тренажёр ЮНИКОД помогает повторить теорию, решить практические задачи и научиться выдерживать уточнения интервьюера.

Перейти в тренажёр →