Функция корректно находит первый элемент, но сначала вычисляет все совпадения и выделяет список. Более эффективный вариант — next по генератору; аргумент objects лучше сделать неизменяемым по умолчанию.
Анализ кода: поиск проблем в реализации get_first_matching_object
Функция корректно находит первый элемент, но сначала вычисляет все совпадения и выделяет список. Более эффективный вариант — next по генератору; аргумент objects лучше сделать неизменяемым по умолчанию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо выполнить ревью представленной функции и обнаружить все её недостатки. Функция get_first_matching_object должна возвращать первый элемент из переданного списка, который удовлетворяет условию‑предикату.
def get_first_matching_object(predicate, objects=[]):
matching_objects = [obj for obj in objects if predicate(obj)]
if matching_objects:
return matching_objects[0]
else:
return None
Ответ
Функция корректно находит первый элемент, но сначала вычисляет все совпадения и выделяет список. Более эффективный вариант — next по генератору; аргумент objects лучше сделать неизменяемым по умолчанию.
Исправление без лишнего промежуточного списка:
def get_first_matching_object(predicate, objects=()):
return next((obj for obj in objects if predicate(obj)), None)
В исходном коде matching_objects именно список, поэтому matching_objects[0] допустимо. Общий список objects пока не меняется и не вызывает накопления, хотя default=[] создаёт риск при будущих правках. Ленивая версия прекращает вызовы predicate после первого совпадения; если предикат имеет побочные эффекты, это существенное изменение поведения, которое нужно учитывать.