Python - определить проблему в коде и переписать без ошибок

В add_user список по умолчанию сохраняется между вызовами, а lambda поздно читает общую i. При буквальном требовании без второго аргумента вернуть самого пользователя нужен отдельный признак отсутствия аргумента.

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

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

В add_user список по умолчанию сохраняется между вызовами, а lambda поздно читает общую i. При буквальном требовании без второго аргумента вернуть самого пользователя нужен отдельный признак отсутствия аргумента.

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

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

Условие

Python - определить проблему в коде и переписать без ошибок

Добавить пользователя в список и вернуть этот список.

Если при вызове не указан второй аргумент, в ответе вернуть пользователя.

def add_user(user, users=[]): users.append(user) return users

print(add_user("User"))

Создать список из трёх функций, где каждая функция при вызове возвращает своё число.

Первая функция должна вернуть - 0, вторая - 1, третья -2:

funcs = [lambda: i for i in range(3)] print([f() for f in funcs])

Ответ

В add_user список по умолчанию сохраняется между вызовами, а lambda поздно читает общую i. При буквальном требовании без второго аргумента вернуть самого пользователя нужен отдельный признак отсутствия аргумента.

_MISSING = object()

def add_user(user, users=_MISSING):
    if users is _MISSING:
        return user
    users.append(user)
    return users

funcs = [lambda i=i: i for i in range(3)]
print([f() for f in funcs])  # [0, 1, 2]

Так add_user('User') возвращает строку, а вызов с переданным списком изменяет этот список. Если подразумевался всегда список, а не сам пользователь, контракт нужно уточнить: тогда создавайте новый пустой список внутри функции при отсутствии аргумента. Захват i=i сохраняет текущее число для каждой функции.

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

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

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

Подробнее