【问题标题】:Using reduce and lambda expression to find sum of square roots [closed]使用 reduce 和 lambda 表达式求平方根的总和 [关闭]
【发布时间】:2014-09-07 13:09:07
【问题描述】:

我一直在学习高阶函数,并想编写一个函数,将函数应用于数字的阶梯范围。 在这种情况下,它应该返回 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)

不胜感激!

【问题讨论】:

  • 您的问题被否决了;为了改进它,我建议:1)你不应该命名一个函数 sum,因为它是一个内置函数 2)你应该阅读关于 reduce 做什么的手册(提示:很确定 Brionius 也需要这样做,如果在他的答案是使用您的 sum 版本而不是内置版本)
  • 对不起命名!看来我对reduce函数的理解有误,谢谢。我相信我包含了所需的行为,有什么我可以添加到潜在的未来问题的吗?

标签: python lambda


【解决方案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 模块),因为编写一个维护累加器的显式循环通常更清晰.

【讨论】:

    【解决方案2】:

    假设 Python 3。让我们正常编码:

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

    让我们从这里开始工作到您正在寻找的东西。首先,让我们用mapsum 替换for 循环。

    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))
    

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

    【讨论】:

    • 谢谢!我喜欢编写可行的代码然后参数化和重构为更优雅的解决方案的想法。
    猜你喜欢
    • 2014-06-24
    • 2017-06-10
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多