Поиск первого подходящего элемента с оператором морж (:=)

Функция вернёт 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 или иной контракт.

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

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

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

Подробнее