python对于“流”的处理以generator为主,这种方式适合拉数据,不适合推数据。
做个简单的扩展,totrg类似imap的推数据版本(可以一对一、一对多、一对零,完成类似imap、filter等功能),preduce类似reduce,groupto类似groupby的推数据版本。
fromsrc与rotrg对应,方便处理输入输出,fromto从输入读出发送到输出,支持标准输入输出、文件、list、generator,groupkv对groupby的扩展。
#
#coding:utf8
import sys
from itertools import imap,groupby
def coroutine(func):
'''协程修饰器,调用一次被修饰的函数即可创建生成器,不用调用next函数'''
def newfunc(*args,**kwargs):
r = func(*args,**kwargs)
r.next()
return r
return newfunc
def fromsrc(src,func=None,multi=False,fargs=()):
'''从src读取,对接受的数据进行处理,之后作为生成器的数据,func为处理函数,
multi表示是否func的输出为一对多'''
if src == sys.stdin:
for data in src:
if func:
if multi:
for d in func(*((data.rstrip('\r\n'),)+fargs)):
yield d
else:
yield func(*((data.rstrip('\r\n'),)+fargs))
else:
yield data.rstrip('\r\n')
elif type(src) == str:
for data in open(src):
if func:
if multi:
for d in func(*((data.rstrip('\r\n'),)+fargs)):