带lambd的Python def函数赋值

2024-04-20 10:19:09 发布

您现在位置:Python中文网/ 问答频道 /正文

这是如何工作的:

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取对了?通过将函数object writer()赋给“who”,我不知何故可以访问lambda?在


Tags: lambdanamemostreturntitledefcallfile
1条回答
网友
1楼 · 发布于 2024-04-20 10:19:09

如果返回的是函数,则外部函数在使用__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提升为:

^{pr2}$

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

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

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

您试图通过向writer传递一个参数,这与定义一个不带参数并尝试传递一个参数的普通函数没有什么不同。在

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

相关问题 更多 >