2024-04-25 22:03:49 发布
网友
下面的表达式实际上是做什么的?你知道吗
list = [lambda n=n: lambda x: x+n for n in range(10)]
更具体地说:
n=n
'list'
它的输出是什么
print(list[0](14))和print(list[0]()(14))
print(list[0](14))
print(list[0]()(14))
为什么?你知道吗
What does n=n mean?
^{}允许您定义接受参数的函数,就像def。这些参数可以有default argument values。因此,lambda n=n:与def foo(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:?The official FAQ解释了这一点,但让我们试着总结一下。你知道吗
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的10个函数(它从视图中隐藏闭包n),其默认值是定义每个函数时n的值。因此,当不带参数调用时,第一个将返回0,第二个返回1,依此类推。你知道吗
当然,在您的例子中,函数不仅仅返回n,它们还返回一个函数,该函数接受一个参数,将n添加到它,然后返回结果。但是想法是一样的,你希望他们返回不同的函数,把0,1,…9加到他们的参数中,而不是所有的函数都返回等于9的函数。你知道吗
What will be the content of list?
list
list将是一个可选参数的10个函数,其默认值范围为0到9,每个函数返回一个参数的函数。返回的函数是来自外部函数的n值的闭包。因此,当调用它时,它返回它的参数x,加上n变量,范围从0到9。你知道吗
x
What will be the output of
在这里,您使用参数14调用第一个外部函数list[0]。因此,n的默认值不是0,而是14。所以,你会得到一个函数,它接受一个参数,然后加上14。但它会打印成这样:
list[0]
<function <listcomp>.<lambda>.<locals>.<lambda> at 0x105f21f28>
这个冗长的混乱是python3.4+试图通过告诉您在哪里可以找到函数定义来提供帮助。通常,当函数嵌套得如此之深时,沿途的大多数步骤都有名称。在本例中,有三层匿名函数,因此没有一个名称非常有用…
为了看到它做任何有用的事情,你必须称之为:
print(list[0](14)(20))
这会给你34。你知道吗
34
您还可以使用inspect模块,或者只使用dir,在函数内部进行遍历。例如,print(list[0](14).__code__.co_freevars[0], list[0](14).__closure__[0].cell_contents)将告诉您它将数字14存储在名称n下,供其内部函数使用。
inspect
dir
print(list[0](14).__code__.co_freevars[0], list[0](14).__closure__[0].cell_contents)
…
在这里,您再次调用list[0],但是这次没有参数,所以它的n得到了0的默认值。因此,它返回一个将0添加到其参数的函数。然后用14调用该函数,得到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
通过运行代码获得。list坏名字顺便说一句,因为list是一个python内置的提供了10个lambda函数,这些函数做的不多-第一个将返回原始参数x,第二个是参数+1,等等。因为n存储为lambda的索引,其中n=n是该lambda的局部索引。你知道吗
^{} 允许您定义接受参数的函数,就像
def
。这些参数可以有default argument values。因此,lambda n=n:
与def foo(n=n):
相同。你知道吗事实上,当你面对一个过于复杂的表达,你读不懂,它往往值得解压成简单的语句:
现在,为什么要创建一个名为
n
的参数,其默认值为n
?为什么不干脆lambda:
?The official FAQ解释了这一点,但让我们试着总结一下。你知道吗如果你写这个:
…得到的是10个没有参数的函数,它们都是同一个变量
n
上的闭包。因为n
在循环的末尾有值9,所以调用时,它们都将返回9。你知道吗但如果你这么做:
…您得到的是一个可选参数
n
的10个函数(它从视图中隐藏闭包n
),其默认值是定义每个函数时n
的值。因此,当不带参数调用时,第一个将返回0,第二个返回1,依此类推。你知道吗当然,在您的例子中,函数不仅仅返回
n
,它们还返回一个函数,该函数接受一个参数,将n
添加到它,然后返回结果。但是想法是一样的,你希望他们返回不同的函数,把0,1,…9加到他们的参数中,而不是所有的函数都返回等于9的函数。你知道吗list
将是一个可选参数的10个函数,其默认值范围为0到9,每个函数返回一个参数的函数。返回的函数是来自外部函数的n
值的闭包。因此,当调用它时,它返回它的参数x
,加上n
变量,范围从0到9。你知道吗在这里,您使用参数14调用第一个外部函数
list[0]
。因此,n
的默认值不是0,而是14。所以,你会得到一个函数,它接受一个参数,然后加上14。但它会打印成这样:这个冗长的混乱是python3.4+试图通过告诉您在哪里可以找到函数定义来提供帮助。通常,当函数嵌套得如此之深时,沿途的大多数步骤都有名称。在本例中,有三层匿名函数,因此没有一个名称非常有用…
为了看到它做任何有用的事情,你必须称之为:
这会给你
34
。你知道吗您还可以使用
inspect
模块,或者只使用dir
,在函数内部进行遍历。例如,print(list[0](14).__code__.co_freevars[0], list[0](14).__closure__[0].cell_contents)
将告诉您它将数字14存储在名称n
下,供其内部函数使用。在这里,您再次调用
list[0]
,但是这次没有参数,所以它的n
得到了0
的默认值。因此,它返回一个将0
添加到其参数的函数。然后用14
调用该函数,得到14
。你知道吗先回答最后一部分:
通过运行代码获得。
list
坏名字顺便说一句,因为list是一个python内置的提供了10个lambda函数,这些函数做的不多-第一个将返回原始参数x,第二个是参数+1,等等。因为n存储为lambda的索引,其中n=n是该lambda的局部索引。你知道吗相关问题 更多 >
编程相关推荐