Problem 5: Remainder Generator (0pts)
Like functions, generators can also be higher-order. For this problem, we will be writing remainders_generator
, which yields a series of generator objects.
remainders_generator takes in an integer m
, and yields m
different generators. The first generator is a generator of multiples of m
, i.e. numbers where the remainder is 0. The second is a generator of natural numbers with remainder 1 when divided by m
. The last generator yields natural numbers with remainder m - 1
when divided by m
. Note that different generators should not influence each other.
Hint: Consider defining an inner generator function. Each yielded generator varies only in that the elements of each generator have a particular remainder when divided by m. What does that tell you about the argument(s) that the inner function should take in?
def remainders_generator(m):
"""
Yields m generators. The ith yielded generator yields natural numbers whose
remainder is i when divided by m.
>>> import types
>>> [isinstance(gen, types.GeneratorType) for gen in remainders_generator(5)]
[True, True, True, True, True]
>>> remainders_four = remainders_generator(4)
>>> for i in range(4):
... print("First 3 natural numbers with remainder {0} when divided by 4:".format(i))
... gen = next(remainders_four)
... for _ in range(3):
... print(next(gen))
First 3 natural numbers with remainder 0 when divided by 4:
4
8
12
First 3 natural numbers with remainder 1 when divided by 4:
1
5
9
First 3 natural numbers with remainder 2 when divided by 4:
2
6
10
First 3 natural numbers with remainder 3 when divided by 4:
3
7
11
"""
"*** YOUR CODE HERE ***"
Note that if you have implemented this correctly, each of the generators yielded by remainder_generator
will be infinite - you can keep calling next on them forever without running into a StopIteration
exception.