python,函数组合通过名称并链接它们以调用in-a-go?
问题描述:
所有,python,函数组合通过名称并链接它们以调用in-a-go?
下面我有混淆可能需要你的帮助
假设我有一个基于行的可变长度的数据矩阵
93 77 96 85
50 69 54 16
39 91 59 38
64 30 18 50
43 9 74 94
44 87 95 89
...
我想通过上面不同的源产生的结果数据生成算法,同时选择不同的范围选择算法,例如下面的代码
lsrc = [# above data]
def rangesel_001(lsrc):
tmp = []
for i in len(lsrc):
if i % 2 = 0:
tmp.append(lsrc[i])
return tmp
def algo_001(lsrc):
tmp = []
for i in len(lsrc):
tmp.append([x+1 for x in lsrc[i]])
return tmp
所以我想要的数据是:
dscl = algo_001(rangesel_001(lsrc))
这里来是我的问题:
假设我有一个可扩展的“rangesel”设置和“ALGO”也是扩展长相这样
rangesel_001() algo_001()
rangesel_002() algo_002()
rangesel_003() algo_003()
… ...
我想将它们混合,然后调用它们-A-去得到所有的结果,我想要什么
rangesel_001 + algo_001
rangesel_001 + algo_002
rangesel_001 + algo_003
rangesel_002 + algo_001
rangesel_002 + algo_002
rangesel_002 + algo_003
...
有没有一种方法可以轻松管理这些函数名,然后将它们结合起来执行?
2.你可能注意到了不同的部分“rangesel” S和“算法中” S算法,这里摘录:
if i % 2 = 0:
and
[x+1 for x in lsrc[i]]
它有没有办法从函数定义确切的公共部分出来,我可以给一些列表:
if i % 2 = 0 rangesel_001
if i % 3 = 0 rangesel_002
if i % 4 = 0 rangesel_003
and
[x+1 for x in lsrc[i]] algo_001
[x/2 for x in lsrc[i]] algo_002
那么我可以得到所有的“rangeset”函数和“算法”集?
也许以后我需要这样的:
dscl = algo_001(rangesel_001( \
algo_002(rangesel_002(lsrc)) \
))
是这样,有一个painfulless我所能链那些 “rangesel_002 + algo_001” 组合? 例如:假设我已经有完整的组合
rangesel_001 + algo_001
rangesel_001 + algo_002
rangesel_001 + algo_003
rangesel_002 + algo_001
rangesel_002 + algo_002
rangesel_002 + algo_003
现在我要挑随机3链他们,并调用得到结果列表?
dscl = random_pick(3, combination_list, lsrc)
谢谢!然后
def compose(f, g):
return lambda *x: f(g(*x))
,您可以::
答
关于第一个问题,你可以定义一个函数合成操作这样
ra = compose(rangeset_001, algo_001)
ra(lsrc)
如果你做的功能列表如下:
rangesets = [rangeset_001, rangeset_002, rangeset_003]
然后你可以迭代:
for r in rangesets:
ra = compose(r, algo_001)
ra(lsrc)
此想法扩展到algo_xxx
功能也是可能的。
感谢Gerg,我可否知道lambda是否可以支持可变参数?例如列表给予? – user478514 2010-10-26 05:11:51
为什么不使用'defcommand(* args,** kwargs):...'和'returncomb'呢? – detly 2010-10-26 05:20:27
@ user478514:是的,我将更改我的示例以显示使用Python'*'表示法。 – 2010-10-26 05:55:37