2014-11-01 118 views
1

我對python比較陌生,我想知道是否可以將一個函數傳遞給另一個函數。我有一些功能,基本上做同樣這樣想:如何將一個函數傳遞給另一個python

if(#some condition): 
    #do something 
else: 
    #do something else 

我想要做的是這樣的:

def generic_func(self, x, y): 
    if #somecondition: 
    #do function x 
    else: 
    #do function y 

def calls_generic_func(self, key, value): 
    lambda x: self.list[-1].set(key,value) 
    lambda y: self.d.set(key,value) 
    self.generic_func(x,y) 

可惜,這似乎並沒有因爲當我打電話self.generic_fun(x,y)我的工作得到一個錯誤,說全球名稱x未定義。有任何想法嗎?

+0

可能重複的[與參數傳遞函數在Python另一個函數?](http://stackoverflow.com/questions/803616/passing-functions-with-arguments-to-another-function-in- python) – Paul 2014-11-01 02:23:55

+0

在'calls_generic_func'中,一行中的lambda表達式就像這樣簡單地被丟棄。它沒有定義x或y,這可能是爲什麼'self.generic_func(x,y)'失敗。 'fun = lambda x:x * x'等價於'def fun(x):(新的縮進行)return x * x'基本上'lambda'允許你內聯寫一行函數,因爲'def'不允許你這樣做(不像javascript的'function()') – Paul 2014-11-01 02:29:28

回答

2

x在下面的表達式中是參數,而不是函數(lambda)。

lambda x: self.list[-1].set(key,value) 

您需要將lambda表達式分配給一個變量並傳遞該變量。

function1 = lambda x: self.list[-1].set(key,value) 
function2 = lambda y: self.d.set(key,value) 
self.generic_func(function1, function2) 

或者你也可以通過lambda表達式本身:

self.generic_func(lambda x: self.list[-1].set(key,value), 
        lambda y: self.d.set(key,value)) 

如果你的意思是函數不帶任何參數,將其刪除(X,Y)。的

self.generic_func(lambda: self.list[-1].set(key,value), 
        lambda: self.d.set(key,value)) 
+1

你認爲lambda表達式有什麼問題嗎?看看左邊的參數x和y在結果的右邊如何不被使用?當然,語法是允許的。一個函數被允許忽略它的參數。但從功能上來說,這不是一個好兆頭。 – Paul 2014-11-01 02:09:44

+1

@保羅,這取決於情況。例如,如果調用者使用事件對象調用,則可以忽略它。 (順便說一句,我在答案中提到了參數) – falsetru 2014-11-01 02:15:28

+0

@Paul,在Python參數中應該匹配參數(除了任意參數和關鍵字參數) – falsetru 2014-11-01 02:16:11

相關問題