python,函数组合通过名称和链接它们来调用in-a-go?

时间:2010-10-26 04:20:45

标签: python function combinations

所有

我在下面混淆可能需要你的帮助

假设我有一个基于行的可变长度数据矩阵

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))

以下是我的问题:

1。假设我有一个可扩展的“rangesel”设置,而且“algo”也可扩展,如下所示

rangesel_001()     algo_001()
rangesel_002()     algo_002()
rangesel_003()     algo_003()
…                    ...

我想混合它们,然后随意调用它们以获得我想要的所有结果

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”中的不同部分和“algo”s算法在这里是片段:

if i % 2 = 0:
 and
[x+1 for x in lsrc[i]]

有一种方法可以从函数定义中找出那些常见的部分,我可以给somekind一个列表:

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

然后我可以获得所有“范围”功能和“算法”集?

3。也许以后我需要这个:

dscl = algo_001(rangesel_001(                             \
                             algo_002(rangesel_002(lsrc)) \  
                            ))

那么,我可以用一种无痛的方式将这些“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)

谢谢!

1 个答案:

答案 0 :(得分:1)

对于第一个问题,您可以定义一个函数组合操作:

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函数。