Для отрицательной границы задайте шаг −1, сохранив исключение самой границы. Тогда foo(-10) вернёт [0, -2, -4, -6, -8].
Поддержка как положительных, так и отрицательных параметров функции
Для отрицательной границы задайте шаг −1, сохранив исключение самой границы. Тогда foo(-10) вернёт [0, -2, -4, -6, -8].
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Сейчас реализованная функция корректно работает только при положительном значении аргумента length. Требуется изменить её так, чтобы она правильно справлялась и с отрицательными значениями length.
def foo(length: int = 10) -> list[int]:
return [i for i in range(length) if i % 2 == 0]
Ответ
Для отрицательной границы задайте шаг −1, сохранив исключение самой границы. Тогда foo(-10) вернёт [0, -2, -4, -6, -8].
Уточним естественный симметричный контракт: перечисляются чётные числа от нуля в направлении length, не включая length.
def foo(length: int = 10) -> list[int]:
step = 1 if length >= 0 else -1
return [value for value in range(0, length, step) if value % 2 == 0]
Для положительного значения поведение сохраняется, для нуля возвращается пустой список. Более короткая эквивалентная запись — list(range(0, length, 2 if length >= 0 else -2)). Если отрицательное число должно означать только количество положительных элементов, это другой контракт; из исходной реализации такое значение автоматически не следует.