【问题标题】:python, functions combination via names and chain them to invoke in-a-go?python,通过名称组合函数并将它们链接起来以立即调用?
【发布时间】:2010-10-26 04:20:45
【问题描述】:

全部,

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

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

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”算法的不同部分在这里是sn-p:

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

现在我想选择随机 3 来链接它们并调用以获取结果列表?

dscl = random_pick(3, combination_list, lsrc)

谢谢!

【问题讨论】:

    标签: python function combinations


    【解决方案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 函数。

    【讨论】:

    • 谢谢 Gerg,请问 lambda 能否支持可变参数?例如给出一个列表?
    • 为什么不改用def composed(*args, **kwargs): ...return composed
    • @user478514:是的,我将更改我的示例以显示使用 Python * 表示法。
    • 谢谢,但我的意思是,如果我已经使用composed() 来制作一个ra 列表,我可以链接并调用它们看起来像ldst = ra[0](ra[1](ra[ 2](lsrc))) 以某种方式使用 lambda?
    • 抱歉,当您像 ra[0] 这样索引时,我不知道您的意思。在我的示例中,rafunction,而不是 list
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多