Аналог range(stop) можно реализовать генератором с while: выдавать числа от нуля, пока текущее значение меньше stop. Для отрицательного stop результат пуст.
Напишите аналог `range(stop)` без использования встроенного `range`; он должен возвращать значения от 0 до `stop`, не включая `stop`. Проверьте результат автоматически.
Аналог range(stop) можно реализовать генератором с while: выдавать числа от нуля, пока текущее значение меньше stop. Для отрицательного stop результат пуст.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Аналог range(stop) можно реализовать генератором с while: выдавать числа от нуля, пока текущее значение меньше stop. Для отрицательного stop результат пуст.
Используем operator.index, чтобы принимать целочисленный протокол, а не молча преобразовывать float:
from operator import index
def my_range(stop):
stop = index(stop)
def values():
current = 0
while current < stop:
yield current
current += 1
return values()
assert list(my_range(4)) == [0, 1, 2, 3]
assert list(my_range(1)) == [0]
assert list(my_range(0)) == []
assert list(my_range(-3)) == []
try:
my_range(1.5)
except TypeError:
pass
else:
raise AssertionError('Ожидался TypeError')
Это одноразовый итератор, не полный объект range с индексированием и повторным обходом. Дополнительная память O(1), время O(max(stop, 0)).