了解给定python代码中lambda的用法

了解给定python代码中lambda的用法,python,lambda,Python,Lambda,在阅读一些代码时,我发现下面的代码片段我无法理解。是否有人能够对下面第3行进行指导/提供提示/链接或基本解释 def do_store(*args, **kwargs): try: key = (args, tuple(sorted(kwargs.items(), key=lambda i:i[0]))) results = f._results 主要是,下面做什么 key=lambda i:i[0] 使用lambda关键字,可以创建“匿名函数”。它们

在阅读一些代码时,我发现下面的代码片段我无法理解。是否有人能够对下面第3行进行指导/提供提示/链接或基本解释

def do_store(*args, **kwargs):
    try:
        key = (args, tuple(sorted(kwargs.items(), key=lambda i:i[0])))
        results = f._results
主要是,下面做什么

key=lambda i:i[0]

使用
lambda
关键字,可以创建“匿名函数”。它们没有(也不需要)名称,因为它们(通常)被立即分配给回调函数

lambda i:i[0]
只是函数的主体

def f(i):
  return i[0]
sorted
函数的
key
参数必须是计算给定项目排序键的函数。您还可以传递上述定义的函数(name)
f
,或者使用
lambda
函数以提高可读性


如回答中所述,在这段代码中,整个
key
参数是无用的。

如果不提及第二个参数,
,key=lambda i:i[0]
,kwargs将仅按其全名排序。比如在电话里

do_store(abc=1, xyz=2, nji=3)

kwargs是一个dict{abc:1,xyz:2,nji:3},
排序(kwargs.items())
将是
[('abc',1),('nji',3),('xyz',2)]
。默认键只是
lambda i:i
(即对于kwargs中的每个元素,我们使用元素本身进行比较)。在您的示例中,我们将仅使用item的第一个对象(即,仅使用dict key,因为item是一对(key,value))

Lambda允许您使用表达式创建简单的匿名函数。在这种情况下,匿名函数接受单个参数“i”,并返回索引为零的“i”中的元素


在本例中,它的目的是创建一个函数,用于选择“sorted()”函数要使用的排序键。

编写此函数的三种等效方法:

lambda i:i[0]
sorted(kwargs.items(), key=lambda i:i[0])
(哪一个是你的)

在所有情况下,参数
都会传递一个函数,该函数接受一个参数并返回该参数的第一个元素


lambda只是一个简写,它可以避免给函数命名。为函数命名可能有助于人们阅读代码,尤其是在表达式更复杂的情况下。
itemgetter
函数在速度上稍有优势,但它所能做的只是返回一个或多个项目,它并没有那么灵活;如果您想进一步操作项目(例如小写),则必须使用
def
lambda

其他答案已经很好地解释了
lambda
排序的
键的
参数的作用。简言之:

  • 用于为排序提供一个,我们将其称为f,这样,如果f(x)
  • 以一种快速而整洁的方式创建这样一个函数,而无需仅为该排序创建
    def
    ;您也可以使用任何其他函数(您自己的定义、内置函数等)
但是,要回答以下问题,
key=lambda i:i[0]
在您的代码中做了什么:什么都没有

更准确地说,它告诉排序的
按要排序的列表中元组的第一个元素排序,该元素由
kwargs.items()
生成,即
(键、值)
元组的列表。但无论如何,按第一个元素排序是元组的默认排序行为,只有当这些元素相等时,才会按第二个元素排序,依此类推。但是,由于这些是字典的
(键、值)
,因此没有两个元组具有相同的第一个元素,因此使用此特定键函数与默认排序完全相同

您也可以使用
key=(args,tuple(sorted(kwargs.items()))


如果您询问它为什么这样做:此函数似乎用于将函数参数(存储在
args
kwargs
中)映射到以前计算的值。为此,必须将
kwargs
字典转换为元组,因为字典是不可散列的,即不能用作另一个字典的键。为了确保相同的字典总是产生相同的元组,必须对其进行排序,因为字典是无序的。

可能需要指出的是,您的第二个代码块实际上相当于
f=lambda i:i[0]
。如果不指定名称,lambda函数就什么都不是。