Напишите аналог `range(stop)` без использования встроенного `range`; он должен возвращать значения от 0 до `stop`, не включая `stop`. Проверьте результат автоматически.

Аналог range(stop) можно реализовать генератором с while: выдавать числа от нуля, пока текущее значение меньше 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)).

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

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

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

Подробнее