将函数作为变量传递,其中一个输入是固定的

时间:2014-02-25 23:39:17

标签: python

假设我有一个二维函数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))

该特定语法不起作用。这样做的最佳方式是什么?

4 个答案:

答案 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)