from lab07 import * # Extra Questions # Q8 def merge(s0, s1): """Yield the elements of strictly increasing iterables s0 and s1, removing repeats. Assume that s0 and s1 have no repeats. You can also assume that s0 and s1 represent infinite sequences. >>> m = merge([0, 2, 4, 6, 8, 10, 12, 14], [0, 3, 6, 9, 12, 15]) >>> type(m) >>> list(m) [0, 2, 3, 4, 6, 8, 9, 10, 12, 14, 15] >>> def big(n): ... k = 0 ... while True: yield k; k += n >>> m = merge(big(2), big(3)) >>> [next(m) for _ in range(11)] [0, 2, 3, 4, 6, 8, 9, 10, 12, 14, 15] """ i0, i1 = iter(s0), iter(s1) e0, e1 = next(i0, None), next(i1, None) "*** YOUR CODE HERE ***" # Q9 def remainders_generator(m): """ Takes in an integer m, and yields m different remainder groups of m. >>> remainders_mod_four = remainders_generator(4) >>> for rem_group in remainders_mod_four: ... for _ in range(3): ... print(next(rem_group)) 0 4 8 1 5 9 2 6 10 3 7 11 """ "*** YOUR CODE HERE ***" # Q10 def zip(*iterables): """ Takes in any number of iterables and zips them together. Returns a generator that outputs a series of lists, each containing the nth items of each iterable. >>> z = zip([1, 2, 3], [4, 5, 6], [7, 8]) >>> for i in z: ... print(i) ... [1, 4, 7] [2, 5, 8] """ "*** YOUR CODE HERE ***"