Функция вернёт True, а не элемент 1: оператор := сохраняет результат predicate(obj). Чтобы вернуть найденный элемент, нужно возвращать obj.
Поиск первого подходящего элемента с оператором морж (:=)
Функция вернёт True, а не элемент 1: оператор := сохраняет результат predicate(obj). Чтобы вернуть найденный элемент, нужно возвращать obj.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо проанализировать работу функции get_first_matching_object, где внутри цикла используется оператор присваивания :=. Определите, какое значение будет возвращено, если вызвать функцию с массивом [1, 2, 3, 4] и предикатом lambda x: x == 1.
def get_first_matching_object(predicate, objects=[]):
for obj in objects:
if object := predicate(obj):
return object
return None
get_first_matching_object(lambda x: x == 1, [1, 2, 3, 4]) # → ?
Ответ
Функция вернёт True, а не элемент 1: оператор := сохраняет результат predicate(obj). Чтобы вернуть найденный элемент, нужно возвращать obj.
На первой итерации предикат lambda x: x == 1 возвращает True. Именно это значение присваивается переменной object и затем возвращается. Хотя True == 1, тип и смысл результата отличаются.
def get_first_matching_object(predicate, objects=()):
for obj in objects:
if predicate(obj):
return obj
return None
Оператор морж здесь не нужен. Имя object также лучше не использовать: оно затеняет встроенный тип. Пустой кортеж безопаснее изменяемого значения по умолчанию. Если None может быть подходящим элементом, для различения «не найдено» понадобится отдельный sentinel или иной контракт.