Возникнет 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 может быть настоящим результатом поиска, используйте отдельный маркер отсутствия.