2016-12-29 68 views
0

我想编写代码来计算毕达哥拉斯定理的论证任意数量。在这里:函数的参数任意数量给出错误类型

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

我想可以通过键入简单地执行代码:

>>> pythag(x,y,z) 

其中xyz是不同的整数,你可以输入你想要的。然而,当我把这个我得到以下错误:

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

我想不通为什么Python的认为我与元组呈现它。我记得几天前为此编写了一个功能正常的代码,但我没有将它保存到任何地方。我似乎无法再提出它。

回答

4

您配置了拉姆达接受参数的任意数目:

lambda *x: ... 

*x意味着捕获所有位置参数对此有没有正式的说法。 Python通过使x成为一个元组来执行此操作,其中包含0个或多个捕获的位置参数值。

你可以很容易地看到这一点,如果你创建了刚刚返回的值拉姆达:

>>> 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'> 

所以xtuple这里,包含您传递的,当你调用拉姆达3点的整数。您不能在元组上使用**电源运算符,这就是x ** 2表达式引起TypeError异常的原因。

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

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

注意,它并没有多大意义,计算任意数量参数的毕达哥拉斯定理;该定理适用于固定数量的输入,您不能将其推广到任意数量。

1

(1,2,3)**2无效蟒蛇

看个究竟试试这个

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 ...

1

你可能想这样的:

pythag(1, 2, 3) 

和Python不知道做(1, 2, 3)**2:如果你这样调用它

from math import sqrt 

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

lst将被分配到的元组(1, 2, 3)。这就是为什么你需要迭代元组的元素。

相关问题