我正在考虑采用不同的方法来获取python中的平方和。我发现以下使用列表推导工作:
def sum_of_squares(n):
return sum(x ** 2 for x in range(1, n))
但是,使用lambda函数时,以下内容不计算:
def sum_of_squares_lambda(n):
return reduce(lambda x, y: x**2 + y**2, range(1, n))
为什么会这样?
答案 0 :(得分:2)
你只应该对每个连续的元素进行平方。 x**2 + y**2
平均运行总计(x
)以及每个连续元素(y
)。将其更改为x + y**2
,您将获得正确的结果。请注意,正如评论中所提到的,这也需要适当的初始值,因此您应该将0
作为可选的第三个参数传递。
>>> sum(x ** 2 for x in range(5,15))
985
>>> reduce(lambda x, y: x + y**2, range(5,15))
965
>>> reduce(lambda x, y: x + y**2, range(5,15), 0)
985
答案 1 :(得分:2)
考虑一下$ git whatchanged --since="1 day ago" -p
$ git whatchanged --since="1 day ago" -p <file> # see changes for a specific file only
的作用。它接受一个调用的输出,并在再次调用同一函数时将其用作第一个参数。所以想象n是4.假设你叫你的lambda reduce
。然后你正在做f
。这相当于:
f(f(1, 2), 3)
因为你的lambda的第一个参数是平方的,你的第一个平方和将在下一次调用时再次平方,然后该和将在下一次再次平方,依此类推。
答案 2 :(得分:0)
假设您插入4:
1^2 + 2^2 = 5 (you then take this result and put it back in the lambda)
5^2 + 3^2 = 34 (for reference the correct answer is 14)
它也会在lambda
。
(您还有一个问题,在您的范围调用中应为n+1
。)
答案 3 :(得分:-2)
(对于python 3用户)
from functools import reduce
能够使用reduce
。
其次,你的函数sum_of_squares_lambda
将无法按预期的方式工作,因为reduce
除了第一个和最后一个参数之外每个参数需要两次(而不是一次)。