Возврат первого подходящего элемента через лямбда‑предикат

Возникнет TypeError, а не None: объект генератора истинен, но не поддерживает обращение по индексу [0]. Используйте next(generator, None).

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

Что ответить на собеседовании

Возникнет TypeError, а не None: объект генератора истинен, но не поддерживает обращение по индексу [0]. Используйте next(generator, None).

Подробный разбор

Ответ с пояснениями

Условие

Определите, какое значение вернёт функция get_first_matching_object, когда в качестве предиката используется лямбда‑выражение lambda x: x == 1, а в качестве последовательности – список [2, 3, 4]. Нужно проверить, соответствует ли полученный результат ожидаемому поведению и нет ли в реализации логических ошибок.

def get_first_matching_object(predicate, objects=[]):
    matching_objects = (obj for obj in objects if predicate(obj))
    if matching_objects:
        found_obj = matching_objects[0]
        return found_obj
    return None

get_first_matching_object(lambda x: x == 1, [2, 3, 4])

Ответ

Возникнет TypeError, а не None: объект генератора истинен, но не поддерживает обращение по индексу [0]. Используйте next(generator, None).

def get_first_matching_object(predicate, objects=None):
    source = () if objects is None else objects
    return next((obj for obj in source if predicate(obj)), None)

Для [2, 3, 4] и проверки x == 1 исправленная функция вернёт None. В исходной версии if matching_objects проверяет сам объект генератора, а не наличие подходящих элементов, поэтому условие проходит даже для будущей пустой последовательности.

Генератор нельзя индексировать; next получает первый подходящий элемент лениво и останавливается. Если None может быть настоящим результатом поиска, используйте отдельный маркер отсутствия.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее