[英]Python tqdm TypeError: <lambda>() takes 1 positional argument but 2 were given
[英]"TypeError: <lambda>() takes 1 positional argument but 2 were given" using reduce()
我想返回列表中傳遞的數字的平方和。
from functools import reduce
def square_sum(numbers):
return reduce(lambda x: x ** 2, numbers)
print(square_sum([1, 2, 2]))
但是我收到錯誤: TypeError: <lambda>() takes 1 positional argument but 2 were given
。 我無法理解其背后的原因。
如果sum
不存在,您可以這樣定義它:
from functools import reduce
def sum(it):
return reduce(lambda acc, val:acc + val, it)
或者:
from functools import reduce
import operator
def sum(it):
return reduce(operator.add, it, 0)
functools.reduce
通過使用您提供的 function 重復組合連續值,將迭代器生成的值減少為單個值。 因此 function 需要能夠組合兩個值,因此必須采用兩個 arguments。
因此,您可以像這樣使用reduce
定義sum_of_squares
,盡管有很多極端情況需要處理:
from functools import reduce
def sum_of_squares(it):
it = iter(it)
try:
first = next(it)
except StopIteration:
return 0
return reduce(lambda acc, val: acc + val * val,
it,
first * first)
就個人而言,我認為以下內容更清楚:
def sum_of_squares(it):
return sum(map(lambda x:x ** 2, it))
reduce()
的function
參數應該采用兩個 arguments:一個舊的和一個新的。 總而言之,您只需要將它們加在一起:
lambda r, x: x**2 + r
然而,這實際上並沒有做你想做的,因為第一個元素永遠不會被平方(所以如果第一個元素>1,它就得不到正確的答案)。 你可能認為reduce()
就像sum ( map ())
:
def square_sum(numbers):
return sum(map(lambda x: x**2, numbers))
但是用生成器表達式替換map
更具可讀性:
def square_sum(numbers):
return sum(x**2 for x in numbers)
print(square_sum([1, 2, 2])) # -> 9
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.