Python 请帮我把下面的lambda翻译成人类语言
下面的表达式实际上是做什么的Python 请帮我把下面的lambda翻译成人类语言,python,lambda,expression,Python,Lambda,Expression,下面的表达式实际上是做什么的 list = [lambda n=n: lambda x: x+n for n in range(10)] 更具体地说: n=n是什么意思 “列表”的内容是什么 它的输出是什么 打印(列表[0](14))和打印(列表[0]()(14)) 为什么?首先回答最后一部分: In [1]: list = [lambda n=n: lambda x: x+n for n in range(10)] In [2]: print(list[0](14)) <functi
list = [lambda n=n: lambda x: x+n for n in range(10)]
更具体地说:
n=n
是什么意思打印(列表[0](14))
和打印(列表[0]()(14))
为什么?首先回答最后一部分:
In [1]: list = [lambda n=n: lambda x: x+n for n in range(10)]
In [2]: print(list[0](14))
<function <lambda> at 0x7f47b5ca7cf8>
In [3]: print(list[0]()(14))
14
[1]中的list=[lambda n=n:lambda x:x+n表示范围(10)中的n]
在[2]中:打印(列表[0](14))
在[3]中:打印(列表[0]()(14))
14
通过运行代码获得<代码>列表坏名字,顺便说一句,因为列表是一个python内置函数,它提供了10个lambda函数,这些函数做的不多——第一个将返回原始参数x,第二个将返回参数+1,等等。as n存储为lambda的索引,其值为该lambda的本地n=n
n=n
是什么意思def
。这些参数可能会产生影响。因此,lambda n=n:
与def foo(n=n):
相同
事实上,当你面对一个太复杂以至于你无法阅读的表达方式时,通常值得把它分解成简单的语句:
list = []
for n in range(10):
def spam(n=n):
def eggs(x):
return x+n
return eggs
list.append(spam)
现在,为什么要创建名为
n
的参数,并使用默认值n
?为什么不干脆lambda:
?解释了这一点,但让我们试着总结一下
如果你只是写下这个:
funcs = [lambda: n for n in range(10)]
…您得到的是10个没有参数的函数,它们都是同一变量上的闭包,n
。因为n
在循环的末尾有值9,所以调用时,它们都将返回9
但如果你这样做:
funcs = [lambda n=n: n for n in range(10)]
…您得到的是一个可选参数n
(从视图中隐藏闭包n
)的10个函数,其默认值是定义每个函数时n
的值。因此,当不带参数调用时,第一个将返回0,第二个将返回1,依此类推
当然,在您的例子中,函数不仅仅返回n
,它们还返回一个函数,该函数接受一个参数,向其添加n
,并返回结果。但想法是一样的;您希望它们返回不同的函数,将0、1、…9添加到它们的参数中,而不是所有函数都返回相同的函数
列表的内容是什么
列表
将是一个可选参数的10个函数,其默认值范围为0到9,每个函数返回一个参数的函数。返回的函数是外部函数的n
值的闭包。因此,当调用它时,它返回它的参数,x
,加上范围从0到9的n
变量
list[0]
。因此,n
的默认值不是0,而是14。因此,您将得到一个函数,它接受一个参数并向其中添加14。但它将打印为如下内容:
<function <listcomp>.<lambda>.<locals>.<lambda> at 0x105f21f28>
这将为您提供34
您还可以使用inspect
模块,或仅使用dir
来查看函数内部。例如,print(list[0](14).\u code\u.co\u freevars[0],list[0](14).\u closure\u\u[0].cell\u contents)
将告诉您它将数字14存储在名称n
下,以供其内部函数使用
在这里,您再次调用
list[0]
,但这次没有参数,因此它的n
获取默认值0
。因此,它返回一个将0
添加到其参数的函数。然后用14
调用该函数,得到14
而不是询问输出结果,为什么不试试呢?运行它。“为什么?”才是真正的问题。。。
<function <listcomp>.<lambda>.<locals>.<lambda> at 0x105f21f28>
print(list[0](14)(20))
print(list[0]()(14))