将lambda函数添加到一起的便捷方法是什么?

时间:2017-02-01 22:55:29

标签: python recursion lambda python-2.x

让我们说我在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。

2 个答案:

答案 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