假设我有一个二维函数f(x,y)和另一个函数G(函数),它将一个函数作为输入。但是,G只将一维函数作为输入,我想将f传递给G,第二个变量作为固定参数。
现在,我只是声明了第三个将y设置为设定值的函数h。这就是它的某种形式:
def f(x,y):
something something something
return z;
def G(f):
something something something
def h(x):
c= something
return f(x,c);
G(h)
在某些时候,我也将y作为默认参数,我每次都会更改。
这些都不像我能以某种方式调用
那样可读G(f(x,c))
该特定语法不起作用。这样做的最佳方式是什么?
答案 0 :(得分:7)
理想的解决方案是使用部分应用程序,但实现此目的的最快捷,最简单的方法是将f
包装在lambda语句中,如下所示:
G(lambda x: F(x, C))
在此示例中,lambda语法创建一个匿名函数,该函数接受一个参数x
,并使用该值f
和常量x
调用C
。这是有效的,因为创建lambda时C
的值被“捕获”,并且它成为lambda中的局部常量。
答案 1 :(得分:6)
可以使用functools.partial函数执行此操作(请注意,示例代码中c
的来源并不完全清楚,所以我假设它是常量的。)
import functools
def f(x,y):
return x+y
c = 3
G = functools.partial(f, c)
G(4)
我认为这比目前建议的lambda方法更明确。
编辑:替换最右边的参数是不可能的,因为我们正在处理位置参数。根据可用的控制级别,您可以引入一个处理切换的包装器:
import functools
def f(x,y):
return x+y
def h(c,y):
return f(y,c)
c = 3
G = functools.partial(h, c)
G(4)
但我认为你现在开始牺牲可读性和可维护性......
答案 2 :(得分:4)
您正在寻找的是一个闭包。
def make_h(c):
def h(x):
return f(x, c)
return h
现在,如果您指定h = make_h(c)
,则h(x)
等于f(x, c)
,您可以将h传递给G。
如果您愿意,functools
库支持闭包(functools.partial
)
答案 3 :(得分:1)
试试这个:
def h():
return lambda x: f(x,c)
无需向x
提供h
- 如果不在范围内,您可以传递最终包装的函数。实际上,h
已经过时,除非您希望它与任何双参数函数一起使用:
def h(functionToWrap, fixedSecondArgument):
return lambda x: functionToWrap(x, fixedSecondArgument)