Возвращайте первое совпадение сразу, не создавая список всех подходящих объектов. Замените изменяемый default на None или пустой кортеж.
Повышение эффективности функции поиска
Возвращайте первое совпадение сразу, не создавая список всех подходящих объектов. Замените изменяемый default на None или пустой кортеж.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо предложить несколько вариантов улучшения функции get_first_matching_object. Рассмотрите применение генераторов, встроенных функций Python и безопасных методов работы со значением по умолчанию.
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])
Ответ
Возвращайте первое совпадение сразу, не создавая список всех подходящих объектов. Замените изменяемый default на None или пустой кортеж.
def get_first_matching_object(cond, items=None):
if items is None:
items = ()
for obj in items:
if cond(obj):
return obj
return None
Короткая альтернатива: next((obj for obj in items if cond(obj)), None), если items уже нормализован. В исходном примере подходящих элементов нет, поэтому вернётся None.
Раннее завершение уменьшает число вызовов предиката, а дополнительная память становится O(1). Исходный default здесь не мутируется, но неизменяемый или None делает контракт безопаснее для будущих изменений. Если None допустим как найденный элемент, нужен отдельный маркер отсутствия.