from itertools import izip, imap from fractions import Fraction, gcd def main(): for x in rationals(): print x def rationals(): yield Fraction() for x in combine(imap(const, naturals())): yield x yield -x def naturals(): n = 1 while True: yield n n += 1 def combine(streams): tmp = [] while True: tmp.append(next(streams)) for stream in tmp: yield next(stream) def const(k): yield Fraction(k, 1) i = 2 while True: if gcd(k, i) == 1: yield Fraction(k, i) i += 1 if __name__ == '__main__': main()