在Python

时间:2015-06-15 10:31:08

标签: python function

我希望有一个函数foo输出另一个函数,其变量列表取决于输入列表。

准确地说:

假设func是一个包含自由变量t和三个参数A,gamma,x

的函数

示例:func = lambda t,A,gamma,x: Somefunction

我想定义一个函数foo,它将列表作为输入并输出另一个函数。输出函数是func的总和,其中每个func加数的参数彼此独立。

根据输入列表,输出变量的变化如下:

如果列表的条目为“无”,则输出函数“获取”一个变量,如果列表的条目是浮点数,则“修复”参数。

示例:

li=[None,None,0.1]
g=foo(li)

提供与

相同的输出

g = lambda t,A,gamma: func(t,A,gamma,0.1)

li=[None,None,0.1,None,0.2,0.3]
g=foo(li)

提供与

相同的输出

g = lambda t,A1,gamma1,A2:func(t,A,gamma,0.1)+func(t,A2,0.2,0.3)

注意:列表中的顺序是相关的,并且需要此行为。

我对如何做到这一点没有任何线索......

我首先尝试构建一个字符串,它依赖于inout列表然后执行它,但这肯定不是那样。

1 个答案:

答案 0 :(得分:2)

首先,将参数从li分区为块。然后使用迭代器从函数参数next获取*args,如果该块中的值是None,或者从参数块中提供值。

def foo(li, func, num_params):
    chunks = (li[i:i+num_params] for i in range(0, len(li), num_params))
    def function(t, *args):
        result = 0
        iter_args = iter(args)
        for chunk in chunks:
            actual_params = [next(iter_args) if x is None else x for x in chunk]
            result += func(t, *actual_params)
        return result
    return function

示例:

def f(t, a, b, c):
    print t, a, b, c
    return a + b + c

func = foo([1,2,None,4,None,6], f, 3)
print func("foo", 3, 5)

输出:

foo 1 2 3  # from first call to f
foo 4 5 6  # from second call to f
21         # result of func