と言うわけでリスト系基本関数三種をジェネレータのように振る舞うようにしてみた。

def mapYield(collection,fn=lambda x:x):
    for item in collection:
        yield fn(item)

def filterYield(collection,fn=lambda x:True):
    for item in collection:
        if fn(item):
            yield item

def reduceYield(collection,fn=lambda x,y:x+y,start=None):
    for item in collection:
        if start==None:
            start = item
            continue
        else:
            start = fn(start,item)
            yield start

for ii in reduceYield(range(10),lambda x,y:x+y): print ii
for ii in mapYield(range(10),lambda x:x*2): print ii
for ii in filterYield(range(10),lambda x:x%2): print ii

reduceだけ長くなったな。