Переписать функцию, используя идиоматический Python

Используйте range с шагом 2 и примените знак к каждому числу. Для включительной границы нужен abs(length) + 1: исходная функция не включает само length.

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

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

Используйте 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.

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

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

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

Подробнее