Функция не вернёт None: объект генератора истинен, поэтому выполнение попадёт в if и found[0] вызовет TypeError. Для первого совпадения используйте next(generator, None).
Возврат результата при передаче лямбда‑функции
Функция не вернёт None: объект генератора истинен, поэтому выполнение попадёт в if и found[0] вызовет TypeError. Для первого совпадения используйте next(generator, None).
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какое значение возвращает функция get_first_matching_object, когда ей передаётся лямбда‑выражение lambda x: x == 1 и список [2, 3, 4]. Убедитесь, что полученный результат соответствует ожидаемому поведению и в реализации нет логических ошибок.
def get_first_matching_object(cond, items=[]):
found = (obj for obj in items if cond(obj))
if found:
result = found[0]
return result
return None
get_first_matching_object(lambda x: x == 1, [2, 3, 4])
Ответ
Функция не вернёт None: объект генератора истинен, поэтому выполнение попадёт в if и found[0] вызовет TypeError. Для первого совпадения используйте next(generator, None).
Генератор не проверяет наличие элементов при приведении к bool и не поддерживает индексирование. Корректная ленивая реализация:
def get_first_matching_object(cond, items=()):
return next((obj for obj in items if cond(obj)), None)
Для lambda x: x == 1 и [2, 3, 4] результат None. При найденном совпадении обход прекращается сразу. Неизменяемое значение по умолчанию убирает риск общего списка между вызовами; в исходном коде список сейчас не меняется, но это полезное упрощение контракта.