2016-03-29 25 views
-1

基本上我想是,它有兩個陣列傳遞math.functions的陣列作爲多變量參數

array1=[1, 2, 3] 
array2=[math.pow(x, 3), math.pow(x, 2)+x, 3*x] 

並且該方法內的方法使用ARRAY1的第一元件爲x中的第一功能array1,array2的第二個元素作爲array2的第二個函數中的x,依此類推。

def cal(array1, array2): 

我也希望通過計算器和我用lambda或使用函數來調用該方法關閉,但它們都沒有解決我的問題。

回答

1

這確實是你說你想要的東西:

import math 

array1 = [1, 2, 3] 
array2 = ['math.pow(x, 3)', 'math.pow(x, 2)+x', '3*x'] 

def cal(values, expressions): 
    return [eval(expression, {'math': math, '__builtins__': None}, {'x': value}) 
       for value, expression in zip(values, expressions)] 

print(cal(array1, array2)) 

輸出:

[1.0, 6.0, 9] 
+0

這正是我所期待的,謝謝! – cadv

+0

@martineau我很好奇,你是如何理解函數被保存爲字符串的,因此需要一個eval? –

+1

@mu無:問題的標題提到了傳遞函數數組,雖然示例代碼顯示了一組表達式,但我選擇了最簡單的方式來表示後者並在不同的上下文中執行它們 - 我認爲它們是真的意味着 - 再加上其他任何需要更多腳手架的工作(例如使用lamda或類方法)。 – martineau

3

你正在尋找python lambda functions

>>> import math 
>>> array1 = [1, 2, 3] 
>>> array2 = [lambda x: math.pow(x, 3), lambda x: math.pow(x, 2)+x, lambda x: 3*x] 
>>> for function in array2: 
...  print map(function, array1) 
... 
[1.0, 8.0, 27.0] 
[2.0, 6.0, 12.0] 
[3, 6, 9] 

基本上,功能分別存儲爲陣列內的可調用的拉姆達,然後,每一個的功能的要求使用內置map ARRAY1的所有值。

作爲一個列表理解,它返回列表的列表:

>>> [map(function, array1) for function in array2] 
[[1.0, 8.0, 27.0], [2.0, 6.0, 12.0], [3, 6, 9]] 

如果你要的功能適用於基於相同指數的每個項目,您可以使用:

>>> [y(x) for (x, y) in zip(array1, array2)] 
[1.0, 6.0, 9] 
+0

謝謝@mu無,我失蹤的部分是內置'map'。 你知道任何內置的函數,但是使用非迭代參數而不是遍歷整個列表嗎? 我可以得到所希望的輸出與 ' n = 0的 陣列= [] 在數組2功能: new_array =地圖(功能,ARRAY1) array.append(new_array [N]) N = N + 1 ' 但是,這是浪費資源。 – cadv

+0

@cadv我不確定我是否完全理解你。據我所知,地圖功能是通常的做法,您可以使用列表理解來獲得累積結果,如更新後的答案。如果您正在尋找基於相同索引的函數,請查看壓縮文件。 –