使用reduce和lambda表达式查找平方根的总和

时间:2014-09-07 13:09:07

标签: python lambda

我一直在学习高阶函数,并希望编写一个函数,将函数应用于步进的数字范围。 在这种情况下,它应该返回0到100之间每隔一个平方根的总和。

def sum(lower, upper, step = 1, func = lambda *x: x):
    return reduce(func, range(lower, upper + 1, step))

sum(0, 100, 2, math.sqrt)

TypeError: sqrt() takes exactly one argument (2 given)

非常感谢任何指针!

2 个答案:

答案 0 :(得分:1)

假设Python 3.让我们正常编写代码:

result = 0
for i in range(0, 100, 2):
    result += math.sqrt(i)
print(result)

让我们从这里开始工作,寻找你想要的东西。首先,我们将for循环替换为mapsum

result = sum(map(math.sqrt, range(0, 100, 2)))
print(result)

现在,我们将把它放在一个函数中。

def sum_of_the_square_roots_from_0_to_100_with_step_2():
    return sum(map(math.sqrt, range(0, 100, 2)))
print(sum_of_the_square_roots_from_0_to_100_with_step_2())

让参数化函数。

def sum_of_func_from_0_to_100_with_step_2(func):
    return sum(map(func, range(0, 100, 2)))
print(sum_of_func_from_0_to_100_with_step_2)

并对范围进行参数化。

def sum_of_func_over_range(func, *range_args):
    return sum(map(func, range(*range_args)))
print(sum_of_func_over_range(math.sqrt, 0, 100, 2))

你有它!传递任何函数(好吧,至少可以调用一个参数)和范围规范。

答案 1 :(得分:1)

您似乎假设reduce在将sort应用于每个元素后会自动添加列表元素。也就是说,您似乎认为reduce的工作原理如下:

def reduce(func, lst, start):
    return sum(map(func, lst), start)

如上所述,您需要将函数传递给sum,并将math.sqrt应用于单个列表值将该结果添加到当前总计。

sum(0, 100, 2, lambda x, y: x + math.sqrt(y))

最简单的方法是使用上面的伪减少的主体:

def sum_of_sqroots(lower, upper, step=1, func=lambda x: x):
    return sum(map(func, range(lower, upper+1, step))
很少需要

reduce(在Python 3中,从内置命名空间“降级”到函数语言之外的functools模块),因为编写明确循环通常更清晰维持累加器。