从Python中的函数内部评估函数对象

时间:2011-10-23 00:39:09

标签: python functional-programming

假设我们有两个已定义的函数对象

add1 = lambda x: x+1

square = lambda x: x*x  

现在我想要一个调用并添加这两个函数结果的函数 我认为可行的是:

def addFuncs(f,g):
    f+g

addFuncs(add1,square)(10)

我认为会给我一个111(10 * 10 + 10 + 1)的答案 但那只是给了我一个错误TypeError: unsupported operand type(s) for +: 'function' and 'function'
所以我试过了:

def addFunctions(f, g):
    def getf():
        return f
    def getg():
        return g
    return getf() + getg()

但仍无济于事...... 但是,如果我这样做

def addFunctions(f, g):
    return f

它弹出100,所以它似乎在返回时评估函数,但我无法弄清楚如何让它首先评估函数然后对它们进行操作。
任何帮助将不胜感激!

EDIT
明白了!

def addFunctions(f, g):
    return lambda x: f(x) + g(x)

3 个答案:

答案 0 :(得分:3)

def addFuncs(f,g):
    return lambda x: f(x) + g(x)

addFuncs(add1,square)(10)

Python不支持将两个尝试一起尝试的功能添加到一起。相反,您需要创建一个新函数,例如使用lambda调用原始函数。

答案 1 :(得分:1)

如果您改为调用这些函数然后添加其返回值,而不是尝试自己添加它们,那么您的原创想法将会有效;

def addFuncs(f,g,x):
    f(x) + g(x)

这是因为 f g 实际上是LambdaTypes,而()运算符会调用它们,允许+运算符添加其返回值。当你直接对它们使用+运算符时,+运算符不知道如何添加两个LambdaTypes。

修改 多补充一点;原因

def addFunctions(f, g):
    def getf():
        return f
    def getg():
        return g
    return getf() + getg()

不起作用是因为你再次尝试将两个函数对象加在一起。但是,你的例子

def addFunctions(f, g):
    return f

将起作用,因为这将只返回另一个函数对象,然后在语句中使用值为10的参数调用

addFuncs(add1,square)(10)

答案 2 :(得分:0)

addFuncs将任意多个函数作为输入并返回一个函数:

def addFuncs(*funcs):
    def _addFuncs(*args):
        return sum(f(*args) for f in funcs)
    return _addFuncs
add1 = lambda x: x+1
square = lambda x: x*x

print(addFuncs(add1,square)(10))

产量

111