Как обрабатывать пустой список на входе?
Что проверяют
Думаете ли вы о граничных случаях до того, как пишете основной код, и договариваетесь ли о контракте функции. Следом обычно спрашивают, чем пустой вход отличается от None и что должна вернуть функция, у которой для пустого набора нет осмысленного ответа.
Как отвечать
Начните с вопроса интервьюеру: что считать правильным результатом на пустом входе. Ответ зависит от операции:
- есть нейтральный элемент: сумма пустого списка это 0, произведение 1, фильтрация и
mapвозвращают пустой список. Особая ветка тут часто не нужна, код и так отработает; - ответа нет: максимум, среднее, первый элемент. Встроенные функции здесь бросают исключение:
max([])даётValueError,statistics.mean([])даётStatisticsError. Можно сделать так же, можно вернутьNoneили принятьdefault, какmax(items, default=None), но выбор надо озвучить и зафиксировать в сигнатуре; - ранний выход: проверка в начале функции спасает от
items[0]и деления наlen(items).
Для специальности важно поведение библиотек. np.mean([]) вернёт nan с предупреждением, а np.max([]) бросит ValueError. У pandas пустая числовая серия даёт sum() равное 0 и mean() равное NaN. Пустоту массива проверяют через arr.size == 0, датафрейма через df.empty, а в PySpark через df.isEmpty(), а не df.count() == 0, который прогонит весь датасет.
В пайплайне пустой батч от источника это отдельное решение: пропустить с записью в лог и метрикой или остановить задачу, если пустота означает поломку выше по потоку.
Закончите тестом: pytest.mark.parametrize с пустым списком, одним элементом и обычным случаем.
Где спотыкаются
Возвращают строку «Список пуст» из функции, которая обычно возвращает список или число. Вызывающий код получает другой тип и падает уже в другом месте.
Пишут if not data для всего подряд. Для DataFrame это ValueError, для генератора условие не срабатывает никогда, даже если он пуст, а None и [] сливаются, хотя могут значить разное.
Молча возвращают 0 для среднего по пустым данным. Метрика выглядит правдоподобной, и сбой источника уходит в отчёт незамеченным.