Python def 函数赋值与 lambda

Posted

技术标签:

【中文标题】Python def 函数赋值与 lambda【英文标题】:Python def function assignment with lambda 【发布时间】:2015-05-08 04:19:08 【问题描述】:

这是如何工作的:

def writer():
    title = "Mr"
    name = (lambda x: title + ' ' + x)
    return name

writer("Bond")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: writer() takes 0 positional arguments but 1 was given

who = writer()

who("Bond")
'Mr Bond'

所以 lambda 采用位置参数 x 对吗?通过将函数对象 writer() 分配给“谁”,我以某种方式可以访问 lambda?

【问题讨论】:

函数也是对象;你的writer() 函数返回一个。 它基本上和在函数工厂中嵌套一个内部函数是一样的 尝试在交互式解释器中键入其中一个以了解正在发生的事情:writer()(不要将其分配给任何东西,从而强制将其返回的内容打印到控制台),或who. 阅读闭包和函数作为对象。另外,更重要的是, lambda 只是定义了一个函数。归还后就可以使用了。 【参考方案1】:

您正在返回一个函数,外部函数关闭了使用 __closure__ 方法创建闭包,因此仍然存在对 title 的引用,因此可以在内部函数中使用它:

def writer():
    title = "Mr"
    name = (lambda x: title + ' ' + x)
    return name

wr = writer()
print(wr.__closure__)
print(wr("foo"))

def writer():
    title = "Mr"
    def name(x):
        return title + ' ' + x
    return name

wr = writer()
print(wr.__closure__)
print(wr("foo"))

(<cell at 0x7eff4b221588: str object at 0x7eff4b11a500>,)
Mr foo
(<cell at 0x7eff49883108: str object at 0x7eff4b11a500>,)
Mr foo

如果您采用以下函数工厂,该函数工厂接受输入 e,这是您想在内部函数中将 x 提高到的指数:

def exp(e):
    def rse_to(x):
        return x ** e
    return rse_to


square = exp(2) 

print(square(2)) # call inner function, returns  2 ** 2

在您的第一个函数中,您不接受任何参数,因此您不能传递任何参数。您只是返回接受一个位置参数的 lambda 函数。

def writer():
    title = "Mr"
    name = (lambda x: title + ' ' + x)
    return name

wr = writer()
print(wr)
<function writer.<locals>.<lambda> at 0x7f60e699dbf8>

通过将 arg 传递给 writer 所做的尝试与定义一个不接受 args 并尝试将 args 传递给它的普通函数没有什么不同。

In [2]: def foo():
   ...:     print("I take no args")
   ...:     

In [3]: foo()
I take no args

In [4]: foo(2)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-3ab2f4e33a15> in <module>()
----> 1 foo(2)

TypeError: foo() takes 0 positional arguments but 1 was given

【讨论】:

所以术语 closure 指的是封闭的 def func 中的所有内容,只要我们返回一个函数(命名或匿名)? 是的,基本上外部函数会覆盖内部函数,否则在内部函数中调用 e 时将不再引用它,就好像您从未定义它一样。

以上是关于Python def 函数赋值与 lambda的主要内容,如果未能解决你的问题,请参考以下文章

python lambda简单介绍

Python的lambda表达式

Python 3 之 lambda匿名函数详解

python中lambda的用法

python中lambda的用法

Python中lambda的使用,与它的三个好基友介绍!