def fizz(s): for i in s: yield (i%3 == 0) and 'fizz' or '', i def buzz(s): for i in s: yield (i[1] % 5 == 0) and (i[0] + 'buzz') or i[0] or str(i[1]) def compose(a,b): return lambda *args: a(b(*args)) q = compose(fizz, range) r = compose("\n".join, buzz) print compose(r,q)(1,101)