Используйте range с шагом 2 и примените знак к каждому числу. Для включительной границы нужен abs(length) + 1: исходная функция не включает само length.
Переписать функцию, используя идиоматический Python
Используйте range с шагом 2 и примените знак к каждому числу. Для включительной границы нужен abs(length) + 1: исходная функция не включает само length.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Функция foo(length: int) должна возвращать все чётные числа от 0 до length (включительно), учитывая знак передаваемого параметра: если length отрицателен, результат также должен быть отрицательным. Требуется оформить реализацию в «python‑стиле», применив list comprehension и повысив читаемость кода.
def foo(length: int = 10) -> list[int]:
result: list[int] = []
is_minus = length < 0
for i in range(abs(length)):
if not i % 2:
result.append(i if not is_minus else i * (-1))
return result
Перепишите данную функцию, используя возможности Python, такие как list comprehension, тернарные выражения и понятные имена переменных, чтобы код стал короче и легче воспринимался.
Ответ
Используйте range с шагом 2 и примените знак к каждому числу. Для включительной границы нужен abs(length) + 1: исходная функция не включает само length.
Реализация в соответствии с текстовым условием:
def foo(length: int = 10) -> list[int]:
sign = -1 if length < 0 else 1
return [sign * value for value in range(0, abs(length) + 1, 2)]
Для 4 получится [0, 2, 4], для -5 — [0, -2, -4], для 0 — [0]. Ноль остаётся нулём при любом знаке. Это намеренно исправляет расхождение с исходным range(abs(length)), который исключал границу. Если нужно буквально сохранить старое поведение, уберите + 1.