如何在python中将一个函数传递给另一个函数

如何在python中将一个函数传递给另一个函数,python,lambda,Python,Lambda,我对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,

我对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
。有什么想法吗?

x
在下面的表达式中是一个参数,而不是一个函数(lambda)

您需要将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)


您是否认为lambda表达式可能有问题,因为左手参数x和y在结果的右手侧从未使用过?当然,语法是允许的。允许函数忽略其参数。“但从功能上来说,这不是一个好兆头。”保罗,这要视情况而定。例如,如果调用方使用事件对象调用,您可以忽略它。(顺便说一句,我在回答中提到了参数)@Paul,在Python中,参数应该匹配参数(除了任意参数、关键字参数),所以当我使用lambda函数时,set命令似乎无法正常工作。我唯一要改变的是创建一个lambda表达式,而不是显式地执行它。知道为什么会发生这种情况吗?@user3766476,不知道列表
self.list
包含什么,我无法回答。列表中包含的对象中是否有
set
方法?在
中调用\u generic\u func
一行上的lambda表达式的可能重复,就像这样简单地丢弃一样。它没有定义x或y,这可能就是
self.generic_func(x,y)
失败的原因
fun=lambda x:x*x
相当于
def-fun(x):(新的缩进行)返回x*x
基本上
lambda
允许您内联编写单行函数,因为
def
不允许您这样做(与javascript的
function()
不同)
self.generic_func(lambda x: self.list[-1].set(key,value),
                  lambda y: self.d.set(key,value))
self.generic_func(lambda: self.list[-1].set(key,value),
                  lambda: self.d.set(key,value))