任意数量的参数的函数给出了类型错误

时间:2016-12-29 17:16:04

标签: python function math lambda tuples

我想编写代码来计算毕达哥拉斯'定理任意数量的参数。这里:

>>> pythag = lambda *x: sqrt(sum(x**2))

我希望只需输入以下代码即可执行代码:

>>> pythag(x,y,z)

其中xyz是不同的整数,您可以根据需要输入任意数量。但是,当我打电话给我时,我得到以下错误:

TypeError: unsupported operand type(s) for ** or pow(): 'tuple' and 'int'. 

我无法弄清楚为什么Python会认为我用元组表示它。我记得几天前写了一个功能正常的代码,但我没有把它保存到任何地方。我似乎无法再提出它了。

3 个答案:

答案 0 :(得分:4)

您将lambda配置为接受任意数量的参数:

lambda *x: ...

*x表示捕获所有没有正式参数的位置参数。 Python通过使x为元组来实现这一点,包含0个或更多捕获的位置参数值。

如果你创建了一个只返回值的lambda,你可以很容易地看到这个:

>>> echo = lambda *x: x
>>> echo(1, 2, 3)
(1, 2, 3)
>>> echo('foo', 'bar', 'baz')
('foo', 'bar', 'baz')
>>> type(echo('foo', 'bar', 'baz'))
<class 'tuple'>

所以x在这里是tuple,包含你在调用lambda时传入的3个整数。您无法在元组上使用**幂运算符,这就是x ** 2表达式引发TypeError异常的原因。

如果你想产生每个上升到2的幂的整数之和,你需要使用一个循环:

lambda *x: sqrt(sum(i ** 2 for i in x))

请注意,计算毕达哥拉斯&#39;并不是很有意义。定理任意数量的参数;该定理适用于固定数量的输入,您不能将其概括为任意数字。

答案 1 :(得分:1)

(1,2,3)**2无效python

看看会发生什么事情试试这个

def a_func(*x): 
   print(x)

a_func(1,2,3,4,5)

修复它你可以做这样的事情

pythag = lambda *x: sqrt(sum(y**2 for y in x))

将执行一个列表推导,并在传入的列表中对每个int进行平方,然后它将对这些值求和,最后它将采用该总和的sqrt ......

答案 2 :(得分:1)

你可能想要这个:

from math import sqrt

pythag = lambda *lst: sqrt(sum(x**2 for x in lst))
如果您以这种方式调用

lst将被分配给元组(1, 2, 3)

pythag(1, 2, 3)

并且python不知道与(1, 2, 3)**2有关。这就是你需要迭代元组元素的原因。