Самодельный генератор диапазона чисел

Реализуйте генератор с текущим значением и шагом; условие остановки зависит от знака шага. Нулевой шаг запрещён, конечная граница не включается, а один аргумент означает диапазон от нуля.

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

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

Реализуйте генератор с текущим значением и шагом; условие остановки зависит от знака шага. Нулевой шаг запрещён, конечная граница не включается, а один аргумент означает диапазон от нуля.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо написать свою версию функции, аналогичной встроенному 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.

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

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

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

Подробнее