【问题标题】:Using lambda inside a function在函数中使用 lambda
【发布时间】:2019-07-10 15:05:03
【问题描述】:

我正在通过在线教程学习 Python 中的 lambda 函数。我明白它是如何工作的,但我遇到了一个让我困惑的例子(this page):

def myfunc(n):
    return lambda a : a * n

mydoubler = myfunc(2)
print(mydoubler(11))

我不明白mydoubler 函数在这里是如何工作的。之前没有定义的 11 怎么作为参数呢?

【问题讨论】:

  • mydoubler 是对 myfunc 返回的 lambda 的引用,并将 a 作为输入。 11 作为 a 传递。
  • mydoublerlambda a: a * n,因此 11 是 a,这是该 lambda 的唯一参数。
  • 你实际上是在这里制作一个柯里化函数

标签: python function lambda


【解决方案1】:

mydoublermyfunc(2) 返回的内容。它返回一个接受单个参数的 lambda,a

当您调用这样的函数时:myfunction(this_argument),它将解析到该位置返回的内容。所以这实际上与写mydoubler = lambda a : a * 2

【讨论】:

    【解决方案2】:

    lambda 函数是一个小型匿名函数。在你的例子中

    myfunc(2) # lambda a: a * 2
    

    您将其翻译为在每个输入元素上应用一个函数。例如,当输入只是一个标量时,这一点非常明显

    mydoubler(11) #outputs 11 * 2 = 22
    

    但是当输入是 arraystring 时,您会期待什么?

    mydoubler([1,1,1]) #outputs [1,1,1] * 2 = [1,1,1,1,1,1]
    mydoubler("str") #outputs "str" * 2 = "strstr"
    

    【讨论】:

      【解决方案3】:

      您的示例有两个函数:外部函数myfunc 和内部函数lambda。一般可以直接调用lambda函数:

      n = 2
      print((lambda a: a * n)(11))
      # 22
      

      或者你可以给这个函数分配一些变量,然后通过这个变量调用它:

      inner = lambda a: a * n
      print(inner(11))
      # 22
      

      你也可以定义一些外部函数,它会返回内部的lambda函数:

      def myfunc():
          n = 2
          return lambda a: a * n
      
      mydoubler = myfunc()
      print(mydoubler(11))
      # 22
      

      相当于:

      mydoubler = lambda a: a * 2
      print(mydoubler(11))
      # 22
      

      在上面的示例中,变量nmyfunc 中声明,在您的情况下,nmyfunc 的参数,它被传递给lambda 函数。函数myfunc 返回lambda 函数,其中n 等于您通过函数调用传递给myfunc 的参数。所以函数调用myfunc(2) 返回函数lambda a: a * 2

      【讨论】:

        【解决方案4】:

        正如 Python 文档所说,lambda 只是匿名函数

        Lambda 表达式(有时称为 lambda 形式)用于创建匿名函数。表达式 lambda 参数:表达式产生一个函数对象。

        你可以在here看到它

        在您的代码 sn-p 中发生的情况是,您的 myfunc 函数使用 n 作为新匿名函数的常量,该函数接收一个名为 a 的参数并返回 a 与 @ 的乘积987654326@。 在您调用n 时,值是2,结果是您调用myfunc(2)。 当您调用 mydoubler(11) 时,当 a 具有值 11 时,您将调用新的匿名函数

        【讨论】:

          【解决方案5】:
          • 根据https://pythonreference.readthedocs.io/en/latest/docs/operators/lambda.html 中的 lambda 文档

            lambda 返回一个匿名函数。

          • 在上述例子中,lambda 函数是 lambda a : a * n 和 lambda 本身返回一些匿名函数,该函数必须类似于

            def mydoubler(a, n):
                return a*n
            
          • 但是在这里,由于我们在调用 myfun() 时已经传递了 n=2,因此执行 mydoubler(a) 只会返回 a*2(此处为 n=2)并因此返回结果。

          【讨论】:

            【解决方案6】:

            这里 mydoubler=myfunc(2) #myfunc(2) 将 lambda 函数返回给 mydoubler

             mydoubler=lambda a:a*2
             # it is similar to x=lambda a:a*2
            
             print(mydoubler(11)
             # it is similar to print(x(11))
            

            【讨论】:

              【解决方案7】:

              当您在分配 mydoubler 后调用该函数时,它返回一个函数,即 lambda FUNCTION,因此,mydoubler 本身变成了一个函数并且可以传入参数。

              【讨论】:

              • 嗨@rajs 欢迎来到stackoverflow。这更像是一个评论而不是一个答案。您还应该查看how to answer 页面。
              【解决方案8】:

              有同样的问题并通过谷歌搜索登陆这里。一开始似乎很难,但一旦理解了就会清晰。

              myfunc 定义了一个带有参数 n 的 lambda 函数,该参数未知。

              mydoubler 通过给参数 n=2 赋值,使用 myfunc 定义了一个 lambda 函数。

              请记住,mydoubler 仍然是一个 lambda 函数,因此它需要变量才能工作,这里位于打印函数 a=11 中。

              【讨论】:

                【解决方案9】:

                我们如何在简单的 1 行中编写 lambda func,即 考虑:

                x = lambda a: a*3
                print(x(2))
                

                我们期望的输出是2*3 =6

                这里的第 2 行 print(x(2)) 只是一个要考虑的值,如果你写 print(x) 它会显示错误为 <function myfunc.<locals>.<lambda> at 0x000001F2D170AD40> 或其他东西。

                同样的事情

                def myfunc(n):
                    return lambda a : a * n
                

                mydoubler 只不过是(x) = myfunc(2) 只不过是(lambda a:a*2) func,只是使用的名称不同。 print(mydoubler(11)) 类似于 print(x(valueof a))

                【讨论】:

                  【解决方案10】:

                  为了理解这个概念,上面的代码可以简化如下:

                  def myfunc(n):
                      return lambda a : a*n
                  mydoubler = myfunc(2)
                  mydoubler(11)
                  

                  这只是因为 lambda 本身就是一个函数。 myfunc(2) 被调用并存储在 mydoubler 中。 myfunc(2) 也与 lambda 共享参数,即 2。 Lambda 和 mydoubler 通过 myfunc(2) 连接。当 mydoubler 被调用并以相等的参数传递给 lambda 时,会自动调用 Lambda 函数。

                  Lambda 函数是没有名称定义的函数。在那里它也被称为匿名函数。

                  【讨论】:

                  • 在此代码中,myfunc 不返回任何内容,mydoubler 未定义。
                  • 与@wjandrea 相同,您能否详细说明 myfunc(2) 或 mydoubler(11) 将说明这些概念吗?
                  猜你喜欢
                  • 2011-12-04
                  • 2018-04-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-02-08
                  • 1970-01-01
                  • 2017-06-04
                  • 2021-02-22
                  相关资源
                  最近更新 更多