Анализ кода: поиск проблем в реализации get_first_matching_object

Функция корректно находит первый элемент, но сначала вычисляет все совпадения и выделяет список. Более эффективный вариант — next по генератору; аргумент objects лучше сделать неизменяемым по умолчанию.

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

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

Функция корректно находит первый элемент, но сначала вычисляет все совпадения и выделяет список. Более эффективный вариант — 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 после первого совпадения; если предикат имеет побочные эффекты, это существенное изменение поведения, которое нужно учитывать.

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

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

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

Подробнее