我希望有一个函数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列表然后执行它,但这肯定不是那样。
答案 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