Python lambda函数

Python lambda函数,python,Python,我无法找出key=key在这个简单的python代码中的作用: for key in dict: f = (lambda key=key: print(key)) print(f()) 在这段代码中,key=key根本没有任何用处。您也可以编写循环 for key in [1,2,3]: f = lambda: key print(f()) 这将打印1、2和3。请注意,与问题无关,我还从lambda中删除了print,而不是直接返回值,因为它是冗余的,只会使外

我无法找出key=key在这个简单的python代码中的作用:

for key in dict:
    f = (lambda key=key: print(key))
    print(f())
在这段代码中,key=key根本没有任何用处。您也可以编写循环

for key in [1,2,3]:
    f = lambda: key
    print(f())
这将打印1、2和3。请注意,与问题无关,我还从lambda中删除了print,而不是直接返回值,因为它是冗余的,只会使外部print变为None,因为这是函数随print返回的结果

但是,如果您没有在循环中正确执行函数,而是在循环之后执行,该怎么办

functions = []
for key in [1,2,3]:
    f = lambda: key
    functions.append(f)

for f in functions:
    print(f())
现在,这将打印3、3和3,因为键变量是在调用函数时计算的,而不是在定义时计算的,即在循环之后,当它的值为3时。这可能会导致一些严重的意外,例如,何时发生

在这里,使用key=key开始起作用:当函数被定义为默认值时,这将创建一个参数键并为其分配循环中key变量的当前值,因此在调用函数时不必传递参数。随后调用函数时,该键参数的值将在函数范围内保持不变:

functions = []
for key in [1,2,3]:
    f = lambda key=key: key
    functions.append(f)
这将打印1、2和3,正如预期的那样。正如其他人所指出的,您可以为参数使用不同的名称,以减少混淆,例如f=lambda param=key:param。

在这段代码中,key=key根本没有任何用处。您也可以编写循环

for key in [1,2,3]:
    f = lambda: key
    print(f())
这将打印1、2和3。请注意,与问题无关,我还从lambda中删除了print,而不是直接返回值,因为它是冗余的,只会使外部print变为None,因为这是函数随print返回的结果

但是,如果您没有在循环中正确执行函数,而是在循环之后执行,该怎么办

functions = []
for key in [1,2,3]:
    f = lambda: key
    functions.append(f)

for f in functions:
    print(f())
现在,这将打印3、3和3,因为键变量是在调用函数时计算的,而不是在定义时计算的,即在循环之后,当它的值为3时。这可能会导致一些严重的意外,例如,何时发生

在这里,使用key=key开始起作用:当函数被定义为默认值时,这将创建一个参数键并为其分配循环中key变量的当前值,因此在调用函数时不必传递参数。随后调用函数时,该键参数的值将在函数范围内保持不变:

functions = []
for key in [1,2,3]:
    f = lambda key=key: key
    functions.append(f)

这将打印1、2和3,正如预期的那样。正如其他人所指出的,您可以为参数使用不同的名称,以减少混淆,例如f=lambda param=key:param。

这段代码并不简单,对于Python新手来说,理解它实际上有点困难

dict中的for键:简单地循环dict是什么。通常,dict是一个预定义的系统库类——标准字典类,对类对象的迭代通常是无意义的

然而,Python允许重新定义dict绑定的内容:dict不是一个关键字,只是一个可以随意重用的常规名称——如果您喜欢编写让IDE和其他程序员感到困惑的糟糕Python代码的话

我将假设在这个上下文中dict是某种可以被迭代的容器:例如,它可以是一个列表、一个元组或一个字典,顾名思义。注意,在Python中,迭代字典意味着迭代字典键

f = (lambda key=key: print(key))
这段代码创建一个未命名的函数,该函数接受一个名为key的参数,并将默认值定义为循环中使用的变量key的当前值。函数体只调用标准的print函数,并将key作为参数传递

该代码相当于:

f = lambda x=key: print(x)
对于新手来说,这可能更清楚一些,因为它避免了重复使用相同的名称

最后,在每次迭代中,调用此函数时不传递任何参数,并将结果发送到打印标准函数。f的求值将打印不通过任何参数的键值。将使用默认值,第二次打印调用将打印无的打印结果

这个例子真的没有什么好处。实际上,λx=x:。。。是Python中的一种模式,有时是必要的,但这里完全是胡说八道,从这种使用中没有什么可学的


你应该重新考虑继续阅读你从中得到的消息来源,我怀疑其他的都是坏消息。请继续阅读官方教程以获得更好的示例…

这段代码并不简单,对于Python新手来说,它实际上有点难以理解

dict中的for键:简单地循环dict是什么。通常,dict是一个预定义的系统库类——标准字典类,对类对象的迭代通常是无意义的

然而,Python允许重新定义dict绑定的内容:dict不是一个关键字,只是一个可以随意重用的常规名称——如果您喜欢编写混淆IDE和其他程序的糟糕Python代码的话 安默斯

我将假设在这个上下文中dict是某种可以被迭代的容器:例如,它可以是一个列表、一个元组或一个字典,顾名思义。注意,在Python中,迭代字典意味着迭代字典键

f = (lambda key=key: print(key))
这段代码创建一个未命名的函数,该函数接受一个名为key的参数,并将默认值定义为循环中使用的变量key的当前值。函数体只调用标准的print函数,并将key作为参数传递

该代码相当于:

f = lambda x=key: print(x)
对于新手来说,这可能更清楚一些,因为它避免了重复使用相同的名称

最后,在每次迭代中,调用此函数时不传递任何参数,并将结果发送到打印标准函数。f的求值将打印不通过任何参数的键值。将使用默认值,第二次打印调用将打印无的打印结果

这个例子真的没有什么好处。实际上,λx=x:。。。是Python中的一种模式,有时是必要的,但这里完全是胡说八道,从这种使用中没有什么可学的


你应该重新考虑继续阅读你从中得到的消息来源,我怀疑其他的都是坏消息。请继续阅读官方教程以获得更好的示例…

您正在将关键迭代器传递给lambda函数。实际上,您甚至可以将其命名为lambda foo=key:printfoo,以便更清楚地了解到底发生了什么。另外,因为您有一个lambda,它几乎可以打印您的密钥,所以printf是冗余的,不会打印任何密钥。所以,你只需要打电话给f。但是,对于打印密钥来说,这是一个非常奇怪的设计选择。为什么不简单地打印密钥。为什么要将密钥重新分配给密钥?谁写的?…可能是编码员累了。。。lol@repzero它不是将密钥重新分配给密钥。lambda接受一个参数,该参数名为key。该名称实际上与实际的迭代器键无关。正如我在评论中解释的,它应该是foo=key。@idjaw..注意点…我没有真正使用lambda函数..但当我看到这一点时似乎有点尴尬..@repzero它实际上是一段非常奇怪的代码。您正在将密钥迭代器传递给lambda函数。实际上,您甚至可以将其命名为lambda foo=key:printfoo,以便更清楚地了解到底发生了什么。另外,因为您有一个lambda,它几乎可以打印您的密钥,所以printf是冗余的,不会打印任何密钥。所以,你只需要打电话给f。但是,对于打印密钥来说,这是一个非常奇怪的设计选择。为什么不简单地打印密钥。为什么要将密钥重新分配给密钥?谁写的?…可能是编码员累了。。。lol@repzero它不是将密钥重新分配给密钥。lambda接受一个参数,该参数名为key。该名称实际上与实际的迭代器键无关。正如我在评论中解释的,它应该是foo=key。@idjaw..point noted…我没有真正使用lambda函数..但当我看到这个时,它看起来有点尴尬..@repzero它实际上是一段非常奇怪的代码。