我想做以下事情:
def getFunction(params):
f= lambda x:
do stuff with params and x
return f
我的语法无效。什么是Pythonic /正确的方法呢?
通过这种方式,我可以拨打f(x)
,而无需致电f(x,params)
,这是一个稍微混乱的IMO。
答案 0 :(得分:7)
lambda
表达式是创建函数的一种非常有限的方式,你不能有多行/表达式(每the tutorial,“它们在语法上限于一个表达式” )。但是,您可以嵌套标准函数def
initions:
def getFunction(params):
def to_return(x):
# do stuff with params and x
return to_return
函数是Python中的第一类对象,因此一旦定义,您可以使用to_return
创建的函数尽可能地传递lambda
,无论哪种方式,它们都可以访问“闭包”变量(参见例如Why aren't python nested functions called closures?)。
答案 1 :(得分:4)
看起来您实际上要做的是partial function application,functools
为其提供了解决方案。例如,如果您有一个函数multiply()
:
def multiply(a, b):
return a * b
...然后你可以创建一个double()
函数 1 ,其中一个参数预先填充如下:
from functools import partial
double = partial(multiply, 2)
......按预期工作:
>>> double(7)
14
1 技术上是一个partial
对象,不是函数,但它的行为方式相同。
答案 2 :(得分:1)
你在Python中不能有多行lambda表达式,但是你可以返回一个lambda或一个完整的函数:
def get_function1(x):
f = lambda y: x + y
return f
def get_function2(x):
def f(y):
return x + y
return f