def fibonacci(): a = 1 b = 1 while True: yield a (a, b) = (b, a + b) def count(start): while True: yield start start += 1 def primes(): known_primes = [2] yield 2 for x in count(3): for div in known_primes: if x % div == 0: break else: yield x known_primes.append(x) def filter_odd(gen): for x in gen: if x % 2 == 0: yield x def filter(gen, condition): for x in gen: if condition(x): yield x def enumerate(gen): i = 0 for x in gen: yield (i, x) i += 1 def tee(gen1, gen2): for x1 in gen1: x2 = gen2.next() yield (x1, x2)