Реализуйте генератор с текущим значением и шагом; условие остановки зависит от знака шага. Нулевой шаг запрещён, конечная граница не включается, а один аргумент означает диапазон от нуля.
Самодельный генератор диапазона чисел
Реализуйте генератор с текущим значением и шагом; условие остановки зависит от знака шага. Нулевой шаг запрещён, конечная граница не включается, а один аргумент означает диапазон от нуля.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать свою версию функции, аналогичной встроенному range. Функция должна возвращать итератор, перебирающий целые числа, начиная с указанного значения, заканчивая (но не включая) конечным параметром и продвигаясь с указанным шагом.
# пример интерфейса
def custom_range(begin: int, end: int = None, step: int = 1):
...
Ответ
Реализуйте генератор с текущим значением и шагом; условие остановки зависит от знака шага. Нулевой шаг запрещён, конечная граница не включается, а один аргумент означает диапазон от нуля.
Пример с целочисленным контрактом:
import operator
def custom_range(begin, end=None, step=1):
if end is None:
begin, end = 0, begin
begin = operator.index(begin)
end = operator.index(end)
step = operator.index(step)
if step == 0:
raise ValueError('step must not be zero')
current = begin
while (current < end if step > 0 else current > end):
yield current
current += step
list(custom_range(5, 0, -2)) даёт [5, 3, 1]. Как у любой функции-генератора, проверки выполняются при первом продвижении, не при создании объекта. В отличие от встроенного range, результат — одноразовый генератор без индексирования и len.