Бесконечный генератор циклических остатков

Проверяйте N > 0 и бесконечно перебирайте range(N). Это выдаёт 0…N−1 без растущего счётчика.

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

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

Проверяйте N > 0 и бесконечно перебирайте range(N). Это выдаёт 0…N−1 без растущего счётчика.

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

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

Условие

Реализуйте функцию‑генератор, принимающую целое число N и бесконечно возвращающую последовательность остатков от деления на N: 0, 1, 2, ..., N‑1, 0, 1, 2, ..., N‑1, ...

Пример 1: Ввод: gen = remainder_generator(3); [next(gen) for _ in range(5)] Вывод: [0, 1, 2, 0, 1]

Пример 2: Ввод: gen = remainder_generator(2); [next(gen) for _ in range(4)] Вывод: [0, 1, 0, 1]

Ответ

Проверяйте N > 0 и бесконечно перебирайте range(N). Это выдаёт 0…N−1 без растущего счётчика.

def remainder_generator(n):
    if type(n) is not int or n <= 0:
        raise ValueError('N должно быть положительным целым')
    while True:
        yield from range(n)

Для n=3 первые пять значений — 0, 1, 2, 0, 1. При n=1 всегда возвращается ноль. Проверка аргумента выполняется при первом продвижении генератора, поскольку функция содержит yield.

Память постоянна относительно числа выданных элементов. Нельзя полностью преобразовать такой генератор в список: он бесконечный. Используйте ограниченное число next или itertools.islice.

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

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

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

Подробнее