适用于函数并返回函数的函数

时间:2016-08-03 06:37:32

标签: python

假设我想定义一个接受函数作为参数的元函数,并返回一个新的修改函数。像

这样的东西
metaf(f) -> f**2

因此无论f结果如何,metaf都会得到2的幂的答案(如果结果不能提升到2的幂,那就这样吧。提出错误)

目前,我发现这样做的方式需要在f的定义中明确提及metaf的论点,即定义

metaf = lambda f, x : f(x)**2

然后

mynewf = lambda x : metaf(f, x)

这有效,但是我想知道它是否适用于复杂的参数函数,其中输入参数可能有很多变化。

所以我想知道你是否可以建议一种不同的方式,特别是那种不需要在metaf定义中指定参数的方法。

修改:以下两个答案都很有帮助。仅供参考,根据答案,我也意识到使用lambda表达式定义metaf的方法。稍微麻烦,但可能仍然值得注意:

metaf = lambda func: lambda *args, **kwargs : func(*args, **kwargs)**2

2 个答案:

答案 0 :(得分:4)

我相信这就是你所追求的:

def metaf(f):
    def func(*r, **kw):
        return f(*r, **kw) ** 2
    return func

现在让我们定义一些f ...

def f(a, b):
    return a + b

以下是转换它:

mynewf = metaf(f)

试一试:

In [148]: f(10, 20)
Out[148]: 30

In [149]: mynewf(10, b=20)
Out[149]: 900

请注意在mynewf的使用中使用普通参数和关键字参数。我按你的预期工作。

答案 1 :(得分:3)

您应该能够使用*args**kwargs来吞噬所有其他参数并将其传递出去:

def squarer(f):
    return lambda *args, **kwargs: f(*args, **kwargs)**2


>>> squarer(lambda x: x+1)(3)
16
>>> squarer(lambda x: x+1)(4)
25
>>> squarer(lambda x,y: x+1)(4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in <lambda>
TypeError: <lambda>() takes exactly 2 arguments (1 given)
>>> squarer(lambda x,y=1: x+y)(4)
25
>>> squarer(lambda x,y=1: x+y)(4,2)
36