TypeError:<lambda>()只取1个参数(给定3个)

时间:2015-07-16 07:25:37

标签: python

鉴于此代码:

sumThree = lambda (x, y, z): (x[0]+ y[0] + z[0], x[1] + y[1] + z[1])
print 'sumThree((1, 2), (3, 4), (5, 6)) = {0}'.format(sumThree((1, 2), (3, 4), (5, 6)))

我明白了:

TypeError                                 Traceback (most recent call last)
<ipython-input-43-7f1b9571e230> in <module>()
     16 # second position summed. E.g. (1, 2), (3, 4), (5, 6) => (1 + 3 + 5, 2 + 4 + 6) => (9, 12)
     17 sumThree = lambda (x0, x1, x2): (x[0]+ y[0] + z[0], x[1] + y[1] + z[1])
---> 18 print 'sumThree((1, 2), (3, 4), (5, 6)) = {0}'.format(sumThree((1, 2), (3, 4), (5, 6)))

TypeError: <lambda>() takes exactly 1 argument (3 given)

问题当然是,为什么?

2 个答案:

答案 0 :(得分:9)

您可以删除lambda参数周围的括号:

sumThree = lambda x, y, z: (x[0]+ y[0] + z[0], x[1] + y[1] + z[1])

或以其他方式将参数作为单个元组传递给原始lambda:

print 'sumThree((1, 2), (3, 4), (5, 6)) = {0}'.format(sumThree(((1, 2), (3, 4), (5, 6))))

答案 1 :(得分:1)

你创建了一个lambda函数,它接受一个参数:元组(x,y,z)。 如果你用一个元组作为唯一参数调用你的函数,它将起作用:

sumThree = lambda (x, y, z): (x[0]+ y[0] + z[0], x[1] + y[1] + z[1])

或者,您可以重新编写lambda函数,不要使用一个元组参数,而是三个参数:

def sumThree(x, y, z):

还要注意,简单地定义命名函数(即{{1}})是一种很好的编码实践。使用lambda函数并将其赋值给变量(sumThree)会破坏lambdas对常规函数的唯一优势:您不需要将它们推送到变量中。