python,函数通过名称组合,并将它们链接到一起调用?

python,函数通过名称组合,并将它们链接到一起调用?,python,function,combinations,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 i

全部,

我有一些困惑,下面可能需要你的帮助

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

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

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”函数和“algo”集合

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
现在我想选择random 3来链接它们并调用以获得结果列表

dscl = random_pick(3, combination_list, lsrc)

谢谢

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

def compose(f, g):
    return lambda *x: f(g(*x))
rangesets = [rangeset_001, rangeset_002, rangeset_003]
然后,您可以:

ra = compose(rangeset_001, algo_001)
ra(lsrc)
如果您制作了如下函数列表:

def compose(f, g):
    return lambda *x: f(g(*x))
rangesets = [rangeset_001, rangeset_002, rangeset_003]
然后您可以迭代:

for r in rangesets:
    ra = compose(r, algo_001)
    ra(lsrc)

也可以将这一思想扩展到
algo_xxx
函数。

谢谢Gerg,我可以知道lambda是否支持可变参数吗?例如,将给出一个列表?为什么不使用
def composited(*args,**kwargs):…
返回composited
?@user478514:是的,我将更改我的示例以显示使用Python
*
表示法。谢谢,但我的意思是,如果我已经使用composited()创建ra列表,我可以像ldst=ra[0]一样链接并调用它们吗(ra[1](ra[2](lsrc)))在某种程度上与lambda有关?抱歉,我不知道您在索引类似
ra[0]
时的意思。在我的示例中
ra
是一个函数,而不是列表。