Функция вернёт True, а не сам элемент 1. Оператор := сохраняет результат predicate(obj), поэтому возвращается булев результат проверки, хотя название функции обещает объект.
Определение первого подходящего элемента через оператор присваивания
Функция вернёт True, а не сам элемент 1. Оператор := сохраняет результат predicate(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), поэтому возвращается булев результат проверки, хотя название функции обещает объект.
На первом элементе predicate(1) возвращает True. Это значение присваивается переменной object и сразу возвращается. True == 1 истинно, но тип и смысл результата отличаются.
Правильный поиск объекта:
def get_first_matching_object(predicate, objects=()):
for obj in objects:
if predicate(obj):
return obj
return None
Имя object также затеняет встроенный тип, поэтому лучше его не использовать для локальной переменной. Default-список не мутируется, но неизменяемый кортеж яснее.