2014-11-01 222 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

相关问题