【问题标题】:How to interpret the following output given by Python?如何解释 Python 给出的以下输出?
【发布时间】:2020-01-20 17:21:33
【问题描述】:

我试图通过弄乱代码来了解 Python 中的 Lambda 函数,以观察 Python 在各种情况下会抛出哪些错误。
谁能解释一下IDLE显示的以下消息的确切含义以及如何解释它?

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

myfunc(2)   

错误:

(函数 myfunc.. at 0x037800B8)

【问题讨论】:

  • 你的return语句应该缩进。

标签: python


【解决方案1】:

您定义的函数返回一个 lambda 函数。这不是错误消息,它正在打印 lambda 函数对象。

【讨论】:

  • 进一步扩展,这里的返回值是一个 lambda 函数,它本身将接受一个数字并将其乘以 2。类似地,执行tripler = myfunc(3) 将返回(进入tripler variable) 一个 lambda 函数,它接受一个数字并将它的三倍。所以你可以然后做print(tripler(10)),它会打印30。
【解决方案2】:

我假设你打错了你的缩进,并且代码 sn-p 是

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

myfunc(2)

这里的lambda 运算符返回一个执行x-> n*x 的函数。所以myfunc本质上是一个返回另一个函数的函数。

你的代码是合法的,python的输出只是返回对象myfunc(2)的描述。让我们分解一下:

  • 前导function 确认您获得了一个函数
  • myfunc.<locals>.lambda 是对象的名称。那部分解释了这个函数是在myfunc中创建的,使用了myfunc的一些参数(注意你在lambda定义中使用了n。这被称为closure
  • 0x037800B8 是这个 python 对象存储的内存地址

【讨论】:

    【解决方案3】:

    您应该将其解释为函数对象或函子。 myfunc.<locals>.<lambda> 它只是说它是 myfunc 的局部变量,它是一个 lambda 函数。

    myfunc(2) # is a function object
    print(myfunc(2)(3)) # prints 6 which is 3 * 2
    

    该函数存储内部变量n = 2,然后返回调用值。这个概念称为功能闭包。

    如果您愿意,您可以拆卸并深入了解更多细节。

    from dis import dis
    def myfunc(n):
        return lambda a:a*n
    dis(myfunc)
    

    输出

    ➜  codebase git:(master) ✗ python temp.py
      3           0 LOAD_CLOSURE             0 (n)
                  2 BUILD_TUPLE              1
                  4 LOAD_CONST               1 (<code object <lambda> at 0x7fc5f671f5d0, file "temp.py", line 3>)
                  6 LOAD_CONST               2 ('myfunc.<locals>.<lambda>')
                  8 MAKE_FUNCTION            8
                 10 RETURN_VALUE
    
    Disassembly of <code object <lambda> at 0x7fc5f671f5d0, file "temp.py", line 3>:
      3           0 LOAD_FAST                0 (a)
                  2 LOAD_DEREF               0 (n)
                  4 BINARY_MULTIPLY
                  6 RETURN_VALUE
    

    【讨论】:

      【解决方案4】:

      这意味着你的命令

      myfunc(2)
      

      返回一个函数(即 myfunc 范围内的 lambda 函数)。 0x037800B8 是它在内存中的地址。

      【讨论】:

        【解决方案5】:

        看起来您正在返回整个 lambda 函数,而不是返回结果。要返回 lambda 函数的值,请将其用括号括起来,如下所示:

        >>> def myfunc(n):
            return (lambda a: a*n)(n)
        
        >>> myfunc(2)
        4
        

        【讨论】:

          【解决方案6】:

          您只是返回对函数的引用。 Lambda 的诞生是为了制作短函数、短类型,避免编写“def function(): ..”的样板

          尝试查看以下教程以了解基础知识:

          https://www.w3schools.com/python/python_lambda.asp

          【讨论】:

            猜你喜欢
            • 2019-08-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多