请帮我把下面的lambda翻译成人类语言

2024-04-25 22:03:49 发布

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

下面的表达式实际上是做什么的?你知道吗

list = [lambda n=n: lambda x: x+n for n in range(10)]

更具体地说:

  1. n=n是什么意思?你知道吗
  2. 'list'的内容是什么?你知道吗
  3. 它的输出是什么

    print(list[0](14))print(list[0]()(14))

为什么?你知道吗


Tags: lambdain内容for表达式rangelistprint
2条回答
  1. What does n=n mean?

^{}允许您定义接受参数的函数,就像def。这些参数可以有default argument values。因此,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解释了这一点,但让我们试着总结一下。你知道吗

如果你写这个:

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的函数。你知道吗


  1. What will be the content of list?

list将是一个可选参数的10个函数,其默认值范围为0到9,每个函数返回一个参数的函数。返回的函数是来自外部函数的n值的闭包。因此,当调用它时,它返回它的参数x,加上n变量,范围从0到9。你知道吗


  1. What will be the output of
print(list[0](14))

在这里,您使用参数14调用第一个外部函数list[0]。因此,n的默认值不是0,而是14。所以,你会得到一个函数,它接受一个参数,然后加上14。但它会打印成这样:

<function <listcomp>.<lambda>.<locals>.<lambda> at 0x105f21f28>

这个冗长的混乱是python3.4+试图通过告诉您在哪里可以找到函数定义来提供帮助。通常,当函数嵌套得如此之深时,沿途的大多数步骤都有名称。在本例中,有三层匿名函数,因此没有一个名称非常有用…

为了看到它做任何有用的事情,你必须称之为:

print(list[0](14)(20))

这会给你34。你知道吗

您还可以使用inspect模块,或者只使用dir,在函数内部进行遍历。例如,print(list[0](14).__code__.co_freevars[0], list[0](14).__closure__[0].cell_contents)将告诉您它将数字14存储在名称n下,供其内部函数使用。

print(list[0]()(14))

在这里,您再次调用list[0],但是这次没有参数,所以它的n得到了0的默认值。因此,它返回一个将0添加到其参数的函数。然后用14调用该函数,得到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的局部索引。你知道吗

相关问题 更多 >