【问题标题】:Python lambda functionPython 拉姆达函数
【发布时间】:2011-06-06 20:22:41
【问题描述】:

这里发生了什么?

reduce(lambda x,y: x+y, [x for x in range(1,1000) if x % 3 == 0 or x % 5 == 0])

我了解 x 如何遍历从 1 到 999 的所有数字并取出可被 3 或 5 整除的数字,但 'lambda x,y: x+y' 部分难倒我。

【问题讨论】:

    标签: python lambda


    【解决方案1】:

    这对 Python 来说很糟糕

    sum(x for x in range(1,1000) if x % 3 == 0 or x % 5 == 0)
    

    它只是将 1..999 范围内可被 3 或 5 整除的所有数字相加。

    reduce() 将给定函数应用于迭代的前两项,然后应用于结果和迭代的下一项,依此类推。在这个例子中,函数

    lambda x, y: x + y
    

    只需添加其操作数。

    【讨论】:

      【解决方案2】:

      f = lambda x, y : x + y
      

      和说的差不多

      def f(x, y):
          return x + y
      

      换句话说,lambda 返回一个函数,给定 : 符号左侧的参数将返回其右侧表达式的值。

      然而对于一个函数来说是相当有限的,例如只允许一个表达式并且不允许任何语句。这不是一个严重的问题,因为在 Python 中,即使在另一个函数的中间,您也可以定义一个完整的函数并传递它。

      但是,您显示的用法非常糟糕,因为 lambda 毫无意义...... Python 将允许直接计算该总和,而不是使用 reduce

      另外,顺便说一下,对于该计算的结果,有一个简单的封闭形式的解决方案,根本不需要任何迭代......(提示:从 1 到 n 的所有数字的总和是 @987654326 @ 并且从 5 到 n 的所有 5 的倍数的总和是 5*(从 1 到 n/5 的所有数字的总和) ...因此 ...)

      【讨论】:

      • 封闭式解决方案实际上比建议的要复杂一些。您需要将所有 3 的倍数和所有 5 的倍数相加,然后再次减去所有 15 的倍数,因为它们被添加了两次。
      【解决方案3】:

      lambda 指定一个匿名函数。语法lambda x,y: x+y可以用英文表述为“声明一个无名函数,带有两个参数,名为xy。执行操作x+y。这个无名函数的返回值将由这个操作的结果”

      reduce 将某个函数依次应用于所提供列表的前两个元素,然后应用于该函数的结果和第三个元素,依此类推。因此,reduce 使用提供的代码中的 lambda 来将提供的列表的元素相加,该列表将包含小于 1000 的所有 3 和 5 的倍数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-05
        • 1970-01-01
        • 1970-01-01
        • 2017-08-28
        • 2011-08-28
        • 2022-10-04
        • 2018-12-13
        相关资源
        最近更新 更多