我想编写代码来计算毕达哥拉斯'定理任意数量的参数。这里:
>>> pythag = lambda *x: sqrt(sum(x**2))
我希望只需输入以下代码即可执行代码:
>>> pythag(x,y,z)
其中x
,y
和z
是不同的整数,您可以根据需要输入任意数量。但是,当我打电话给我时,我得到以下错误:
TypeError: unsupported operand type(s) for ** or pow(): 'tuple' and 'int'.
我无法弄清楚为什么Python会认为我用元组表示它。我记得几天前写了一个功能正常的代码,但我没有把它保存到任何地方。我似乎无法再提出它了。
答案 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
有关。这就是你需要迭代元组元素的原因。