繁体   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