2017-02-01 57 views
4

比方說,我有一個Python模塊在這個函數:方便的方法將lambda函數一起添加?

def functionmaker(a,b): 
    return lambda x: (a*x) + b 

現在讓我們說,我給這個格式的列表:任意長度的 ablist = [[a1, b1], [a2, b2]...[an, bn]]

我的目標是將所有從這些a和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 

但似乎你不能調用函數內部本身那樣。我希望它會覆蓋舊版本的「功能」與新的,但我猜不是。我想我可能需要做某種遞歸的方式,但也許有更好的方法?

順便說一下,我使用python 2.7。

+0

你能格式化你的代碼了一點點,有一個只是純文本的功能,並且是縮進的。 – TankorSmash

+0

對於它的價值,'lambda'函數_can_在他們的定義中調用自己。 – martineau

+0

你是什麼意思「加起來」的功能?評估它們並添加結果?或者生成一系列嵌套函數? –

回答

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 

如果y OU需要計算這個量爲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 
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