Нахождение первого элемента, удовлетворяющего условию

Генератор всегда проходит проверку if candidates, но не поддерживает candidates[0]. Используйте next(candidates, None); вместо общего изменяемого списка задайте пустой кортеж по умолчанию.

Короткий ответ

Что ответить на собеседовании

Генератор всегда проходит проверку if candidates, но не поддерживает candidates[0]. Используйте next(candidates, None); вместо общего изменяемого списка задайте пустой кортеж по умолчанию.

Подробный разбор

Ответ с пояснениями

Условие

Код‑ревью. Оценить корректность реализации, безопасность использования генераторов и потенциальные проблемы с изменяемыми аргументами по умолчанию.

def get_first_matching_object(cond, items=[]):
    candidates = (obj for obj in items if cond(obj))
    if candidates:
        result = candidates[0]
        return result
    else:
        return None

Ответ

Генератор всегда проходит проверку if candidates, но не поддерживает candidates[0]. Используйте next(candidates, None); вместо общего изменяемого списка задайте пустой кортеж по умолчанию.

Исправленная функция лениво ищет первое совпадение:

def get_first_matching_object(cond, items=()):
    return next((obj for obj in items if cond(obj)), None)

Если подходящего элемента нет, возвращается None, а после первого совпадения дальнейшие элементы не проверяются. В исходнике ошибка возникает ещё до поиска: индексирование генератора вызывает TypeError. Если None сам может быть допустимым результатом, для различения «найден None» и «не найдено» потребуется отдельный sentinel или другой контракт результата.

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

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

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

Подробнее