在Python中从函数内部评估函数对象
假设我们有两个已经定义好的函数对象:
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)
这是因为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)
3
def addFuncs(f,g):
return lambda x: f(x) + g(x)
addFuncs(add1,square)(10)
Python不支持把两个函数直接加在一起,这就是你之前尝试的方式不行的原因。相反,你需要创建一个新的函数,比如用lambda,这个新函数会调用原来的函数。