Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 请帮我把下面的lambda翻译成人类语言_Python_Lambda_Expression - Fatal编程技术网

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
    变量


  • 它的输出是什么
  • 在这里,您使用参数14调用第一个外部函数,
    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))