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

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

Собеседование Junior Python-разработчика: SQL, индексы, исключения и итераторы

Разбираем четыре частых блока Python-интервью: SQL и планы запросов, индексы, обработку исключений, итераторы и специальные методы.

Компания
Тетрик
Опубликовано
Обновлено
Видео вышло
Видео
14:35
Текст
5 минут

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

Смотреть на

Это техническое собеседование Python-разработчика. Компания и точный грейд не названы. Вопросы охватывают SQL, диагностику запросов, исключения, итераторы, структуры данных и практический случай с Airflow.

Сколько строк вернут INNER JOIN и LEFT JOIN

Короткий ответ: INNER JOIN оставит только совпадения, LEFT JOIN сохранит все строки слева, но совпадения могут размножить строки.

Если одной строке левой таблицы соответствуют три строки правой, результат содержит три строки. Поэтому нельзя ответить только по количеству строк в исходных таблицах — нужны ключи, уникальность и условие соединения.

UNION складывает результаты запросов вертикально и удаляет дубликаты. UNION ALL сохраняет их и обычно дешевле. JOIN соединяет столбцы по условию. Это разные операции, хотя итоговые таблицы иногда выглядят похоже.

Чем EXPLAIN отличается от EXPLAIN ANALYZE

Короткий ответ: EXPLAIN показывает оценочный план, а EXPLAIN ANALYZE выполняет запрос и показывает фактическое время и число строк.

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

EXPLAIN ANALYZE нельзя бездумно запускать на изменяющем запросе в рабочей базе: команда действительно выполняется. На интервью важно проговорить и диагностику, и безопасность.

Индекс помогает, когда запрос выбирает небольшую часть данных или поддерживает сортировку и соединение. Но индекс занимает место и замедляет запись, поэтому «добавить индекс на всё» — плохой ответ.

Пример структуры B-tree с ключами во внутренних узлах

B-tree хранит несколько ключей в узле и делит поиск на диапазоны — поэтому индекс не приходится просматривать целиком. Источник: CyHawk, Wikimedia Commons, CC BY-SA 3.0.

Как работают try, except, else и finally

Короткий ответ: except обрабатывает подходящую ошибку, else выполняется без исключения, finally нужен для обязательного завершения.

Нужно ловить конкретные исключения и не скрывать ошибку пустым except. Если ресурс имеет контекстный менеджер, with обычно понятнее ручного finally.

Типичная ошибка. Оборачивать всю функцию в except Exception и возвращать None. Причина сбоя исчезает, а вызывающий код не отличает ошибку от корректного пустого результата.

Как лучше. Сужайте блок try до операции, которая действительно может завершиться ожидаемой ошибкой, ловите конкретный тип и либо восстанавливайте работу, либо добавляйте контекст и передавайте исключение выше.

Пример кодаPython
def read_first_line(path):
    # Контекстный менеджер закроет файл даже при ошибке чтения.
    with open(path, encoding="utf-8") as source:
        # Возвращаем первую строку без завершающего переноса.
        return source.readline().rstrip("\n")

Метод __exit__ получает сведения об исключении. Он может подавить ошибку, вернув истинное значение, но это делают только осознанно.

Чем итератор отличается от генератора

Короткий ответ: итератор реализует протокол __iter__ и __next__, а генератор создаёт итератор через функцию с yield.

Генератор не хранит сразу весь результат. Он останавливается на yield, сохраняет состояние и продолжает со следующего вызова next.

Пример кодаPython
def even_numbers(limit):
    # Проверяем числа по одному, не создавая отдельный список.
    for number in range(limit):
        if number % 2 == 0:
            # yield возвращает значение и сохраняет состояние функции.
            yield number

Список удобен для повторных проходов и доступа по индексу. Генератор — для потока данных и экономии памяти. Выбор зависит от дальнейших операций.

Можно ли удалить n-й элемент за O(1)

Короткий ответ: только если у нас уже есть ссылка на нужный узел подходящей структуры данных.

Поиск n-го элемента односвязного списка занимает O(n). После нахождения удаление следующего узла выполняется за O(1) изменением ссылки. В массиве или Python-списке элементы после удалённого обычно приходится сдвигать, поэтому операция занимает O(n).

Сильный ответ сначала уточняет структуру и то, что именно дано: индекс, значение или готовая ссылка. Без этих условий обещание O(1) бессмысленно.

Как управлять параллельностью задач в Airflow

Короткий ответ: разделить расписание, зависимости, лимиты параллелизма и ограничения внешних систем.

Если DAG должен завершиться в определённое окно, мы оцениваем критический путь, разрешаем независимым задачам работать параллельно и задаём лимиты, чтобы не перегрузить базу или API. Пулы ограничивают общий дефицитный ресурс, а настройки DAG и задач — число одновременных запусков.

Повторные попытки должны быть безопасны. Если задача пишет данные, она должна быть идемпотентной либо проверять уже выполненный результат. Иначе повтор после сбоя создаст дубликаты.

Получил бы кандидат оффер

Короткий ответ: скорее да, техническая секция выглядит пройденной.

Кандидат уверенно рассуждал о SQL, Python и проектировании пайплайна. Пробелы касались отдельных видов индексов и деталей сортировки, но не разрушали базовое понимание. По уровню ответов это уверенный Middle.

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

Источники

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

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

Нужно ли Junior Python-разработчику знать планы SQL-запросов?

Да, на базовом уровне. Достаточно понимать последовательное и индексное чтение, стоимость плана, фактическое время в EXPLAIN ANALYZE и причины, по которым индекс может не использоваться.

Чем итерируемый объект отличается от итератора?

Итерируемый объект умеет вернуть итератор через iter. Итератор хранит состояние обхода и возвращает следующий элемент через next, а после окончания поднимает StopIteration.

Стоит ли перехватывать Exception целиком?

В прикладном коде лучше ловить ожидаемые конкретные исключения. Широкий перехват допустим на внешней границе процесса для логирования и корректного завершения, но ошибку нельзя молча скрывать.

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

Проверьте готовность к Python-интервью

Тренажёр ЮНИКОД помогает пройти вопросы по Python и базам данных, найти пробелы и собрать план повторения.

Начать тренировку →