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

2 投票
3 回答
579 浏览
提问于 2025-04-17 04:50

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

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,这说明它在返回时会计算这个函数的值。但我就是搞不清楚怎么让它先计算这两个函数的值,然后再进行加法运算。
如果有人能帮我就太好了!

编辑
我明白了!

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

3 个回答

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
1

你的最初想法是可行的,但你需要先调用这些函数,然后把它们的返回值加起来,而不是直接尝试把它们加在一起。

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

这是因为fg实际上是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)
3
def addFuncs(f,g):
    return lambda x: f(x) + g(x)

addFuncs(add1,square)(10)

Python不支持把两个函数直接加在一起,这就是你之前尝试的方式不行的原因。相反,你需要创建一个新的函数,比如用lambda,这个新函数会调用原来的函数。

撰写回答