簡體   English   中英

“類型錯誤:<lambda> () 采用 1 個位置參數,但使用 reduce() 給出了 2 個</lambda>

[英]"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM