让我们说我在python模块中有这个功能:
def functionmaker(a,b):
return lambda x: (a*x) + b
现在让我们说我得到了这种格式的列表:
ablist = [[a1, b1], [a2, b2]...[an, bn]]
任意长度。
我的目标是将您从这些和b中获得的所有功能相加。
当然,通过我给出的ax + b的简单示例,你可以代数地将其作为(a1 + a2 + ... an)x + (b1 + b2 + ... bn)
。但是,让我们暂时忽略它。我实际使用的函数是一个收缩的高斯分子轨道函数,并且用代数来解决问题并不容易。
我想做的是这样的事情:
function = lambda x: (a1*x) + b1
q = 2
while q < n:
function = lambda x: function(x) + (ablist[q][0]*x) + ablist[q][1])
q += 1
但似乎你不能像这样在内部调用一个函数。我希望它只会覆盖旧版本的&#34;功能&#34;新的,但我猜不是。我想我可能需要做一些递归的方式,但也许有更好的方法?
顺便说一句,我使用的是python 2.7。
答案 0 :(得分:3)
您可以这样做:
>>> def functionmaker(a, b):
... return lambda x: a*x + b
...
>>> def summer_funcs(args):
... return lambda x: sum(functionmaker(*a)(x) for a in args)
...
>>> arguments = [(1,2), (3,4), (5,6)]
>>> summer_funcs(arguments)(1)
21
或者如果您愿意:
>>> f = summer_funcs(arguments)
>>> f(1)
21
>>> f(2)
30
答案 1 :(得分:2)
如果我正确理解了您的问题,您可以使用内置的sum()
函数并传递generator expression参数来完成目标:
def functionmaker(a, b):
return lambda x: (a*x) + b
ablist = [(1,2), (3,4), (5,6)]
x = 1
total = sum(functionmaker(a, b)(x) for a, b in ablist)
print(total) # -> 21
如果您需要为x
的许多不同值计算此数量,那么为此优化事情可能是值得的:
functions = [functionmaker(a, b) for a, b in ablist]
sum_of_functions = lambda x: sum(function(x) for function in functions)
for x in (1, 1.5, 2):
print('sum_of_functions(x={:.1f}) -> {:.1f}'.format(x, sum_of_functions(x)))
输出:
sum_of_functions(x=1.0) -> 21.0
sum_of_functions(x=1.5) -> 25.5
sum_of_functions(x=2.0) -> 30.0