Что должна возвращать функция, если пара чисел не найдена?
Что проверяют
Продумываете ли вы контракт функции, а не только счастливый путь. За вопросом обычно стоит задача про два числа с заданной суммой, и интервьюеру интересно, выберете ли вы одно предсказуемое поведение и сможете ли объяснить, чем оно удобно вызывающему коду.
Как отвечать
Назовите варианты и осознанно выберите один:
None, если «не найдено» это нормальный исход. Тип результата тогдаOptional[tuple[int, int]], и это честно видно в аннотации;- пустой кортеж или список, если вызывающий код перебирает результат: тип один на все случаи, ветвлений меньше;
- исключение, если отсутствие пары нарушает предусловие, а не является обычным делом. Тогда своё понятное исключение, а не голый
ValueErrorбез текста; - сторожевое значение вроде
-1, если возвращаются индексы. В учебных задачах так принято, в рабочем коде это мина:-1сам по себе валидный индекс.
Главное правило: один способ на все ветки. Функция, которая иногда отдаёт кортеж, иногда None, а иногда бросает исключение, заставляет вызывающего проверять всё сразу. Решение фиксируется аннотацией типов и строкой документации. Заодно скажите, что сам поиск делается за один проход через словарь уже увиденных чисел, а не двойным циклом.
Где спотыкаются
Проверяют результат на истинность. Если функция возвращает не пару, а индекс или сумму, то валидный ноль неотличим от «не найдено» в проверке if result:. Явное сравнение if result is None: не ломается ни на нуле, ни на пустом списке.
Возвращают (None, None), чтобы «сохранить форму». Распаковка проходит, ошибка всплывает позже, при попытке сложить или сравнить эти значения, и уже далеко от места, где пара не нашлась. Один None честнее.
Делают исключение штатным ответом. Если пара не находится в половине вызовов, try/except становится основным потоком управления, а читается он как аварийная ситуация. Исключение уместно там, где продолжать действительно нельзя.