Проверяйте 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.