我一直在学习高阶函数,并希望编写一个函数,将函数应用于步进的数字范围。 在这种情况下,它应该返回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)
非常感谢任何指针!
答案 0 :(得分:1)
假设Python 3.让我们正常编写代码:
result = 0
for i in range(0, 100, 2):
result += math.sqrt(i)
print(result)
让我们从这里开始工作,寻找你想要的东西。首先,我们将for
循环替换为map
和sum
。
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
模块),因为编写明确循环通常更清晰维持累加器。