【问题标题】:Lambda Function: Understanding lambda function?Lambda 函数:了解 lambda 函数?
【发布时间】:2021-02-26 09:17:07
【问题描述】:

案例 1: 错误输出

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

mytripler(11) = myfunc(3)    => Error 

=============================================

案例 2: 正确输出

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

  mytripler = myfunc(3)

  print(mytripler(11))

值 11 如何在第二种情况下传递给方法?

【问题讨论】:

  • 第二种情况下mytripler是如何定义的?
  • 案例 1 没有意义。您正在尝试分配函数调用的结果。当然这会报错。
  • @Heike 已编辑。你可以复习一下。
  • @khelwood 当我提到 multiplier(11) 时,这里如何将 11 分配给变量 'a'?

标签: python python-3.x lambda


【解决方案1】:

当执行 myfunc 时,它会返回另一个函数...

def myfunc(n):
    Return lambda x : x*n

和写一样..

def myfunc(n):
    def f(x):
         Return x*n
    return f

因此,在第一个函数中,您将返回另一个函数,并且由于它已形成闭包,因此它可以访问父函数的 n 变量。

【讨论】:

  • 当我写 multiplier(11) 时,编译器是如何理解它应该将值赋给变量“a”的?
【解决方案2】:

这是因为 lambda 函数的工作方式,在您的情况下使用值 11 代替变量 'a' 而 n 已经是 3。

mytripler = myfunc(3) 运行时,它返回一个函数(lambda),看起来像

          def fun(a) : 
              return a * 3 

现在 mytripler 指向上面的函数“fun”,它接受一个参数并将其乘以 3。

【讨论】:

    【解决方案3】:

    您的函数 myfunc 返回一个函数/可调用函数(在本例中为 lambda 函数),如下所示:

    >>> def myfunc(n):
    ...    return lambda a : a * n
    >>> print(myfunc)
    <function myfunc at 0x7efe15c9dea0>
    

    现在,当我们调用 myfunc 时,作为 n 传递的值将被绑定到 lambda 函数中:

    >>> mytripler = myfunc(3)
    >>> print(mytripler)
    <function myfunc.<locals>.<lambda> at 0x7efe14f20598>
    

    此时mytripler定义为lambda a : a * 3n 被我们作为参数传递给myfunc() 的值(或者:已被赋值)替换。请注意,此 lambda 构造在功能上等同于:

    >>> def mytripler(a):
    ...     return a * 3
    

    现在,我们可以用一个值调用mytripler 来进行最终的计算/执行:

    >>> mytripler(11)
    33
    

    您的错误是您无法为左侧的函数调用赋值:

    >>> mytripler(11) = myfunc(3)
      File "<input>", line 1
    SyntaxError: can't assign to function call
    

    但是您可以跳过将 myfunc 的结果分配给名称 mytripler 的中间步骤,而是将两个函数调用链接在一起,如下所示:

    >>> myfunc(3)(11)
    33
    

    这能回答你的问题吗?

    【讨论】:

    • 当我写 multiplier(11) 时,编译器是如何理解它应该将值赋给变量“a”的?
    • @RudreshGt Python 有一个解释器,而不是一个编译器(差别不大或差别很大,取决于你想要表达的观点)。
    • @RudreshGt 我编辑了我的答案。这样更清楚吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2019-10-28
    • 2013-09-08
    相关资源
    最近更新 更多