2016-12-29 92 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)。這就是爲什麼你需要迭代元組的元素。

相關問題