在Python代码中,`lambda`是什么?它如何与`sorted`、`sum`等函数的`key`参数一起使用?

86

我看到一些使用内置函数如sortedsum等的示例,它们使用key=lambda

这里的lambda是什么意思?它是如何工作的?


关于 lambda 的一般计算机科学概念,请参见 什么是lambda函数?

另请参阅lambda有哪些用处?进行一些讨论,该讨论不再符合站点标准,但您可能会发现其有用。


在这种情况下,key是一个关键字参数,与lambda无关。 - l4mpi
请查看此链接:https://dev59.com/OGox5IYBdhLWcg3wyXVx - Sachin Jain
4个回答

123

lambda 是一个匿名函数。

>>> f = lambda: 'foo'
>>> print(f())
foo

这种写法通常在函数中使用,例如 sorted() 函数会将可调用对象作为参数传入(通常是关键字参数 key),您可以提供一个现有的函数来替代 lambda ,只要它是可调用的对象即可。

sorted() 函数 为例,它会按顺序返回给定的迭代器:

>>> sorted(['Some', 'words', 'sort', 'differently'])
['Some', 'differently', 'sort', 'words']

但是这种方式将大写字母的单词排在小写字母的单词之前。使用 key 关键字,您可以更改每个条目,使其排序不同。例如,我们可以在排序之前将所有单词转换为小写:

>>> def lowercased(word): return word.lower()
...
>>> lowercased('Some')
'some'
>>> sorted(['Some', 'words', 'sort', 'differently'], key=lowercased)
['differently', 'Some', 'sort', 'words']

我们不得不为此创建一个单独的函数,不能将def lowercased()行内到sorted()表达式中:

>>> sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower())
  File "<stdin>", line 1
    sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower())
                                                           ^
SyntaxError: invalid syntax

相反,lambda可以直接在sorted()表达式中内联指定:

 >>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower())
['differently', 'Some', 'sort', 'words']

Lambda函数只能包含一个表达式,其结果将作为返回值。

在Python库中有很多地方(包括内置函数)可以接受可调用对象作为关键字参数或位置参数。这些地方太多了,无法在此一一列举,并且它们通常发挥着不同的作用。


22
在Python中,lambda是一个关键字,用于定义匿名函数(即没有名称的函数),有时称为lambda函数(来自该关键字,该关键字又来自理论)。让我们看一些例子:
>>> # Define a lambda function that takes 2 parameters and sums them:
>>> lambda num1, num2: num1 + num2 
<function <lambda> at 0x1004b5de8>
>>> 
>>> # We can store the returned value in variable & call it:
>>> addition = lambda num1, num2: num1 + num2
>>> addition(62, 5)
67
>>> addition(1700, 29)
1729
>>> 
>>> # Since it's an expression, we can use it in-line instead:
>>> (lambda num1, num2: num1 + num2)(120, 1)
121
>>> (lambda num1, num2: num1 + num2)(-68, 2)
-66
>>> (lambda num1, num2: num1 + num2)(-68, 2**3)
-60
>>> 

现在让我们看看在sorted的背景下它是如何工作的。

假设我们有一个列表,其中包含混合了整数和具有数值内容的字符串:

nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]

我们希望根据它们所代表的数字对数值进行排序,因此结果应为['-10', '-1',1,'2',3,4,'5','8']

如果我们尝试使用sorted来排序,我们会得到错误的结果:

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
>>> sorted(nums) # in 2.x
[1, 3, 4, '-1', '-10', '2', '5', '8']
>>> # In 3.x, an exception is raised instead

然而,通过使用sortedkey参数,我们可以根据将key函数应用于每个值的结果对值进行排序:

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
>>> sorted(nums, key=int)
['-10', '-1', 1, '2', 3, 4, '5', '8']
>>> 

由于lambda创建了一个可调用对象(具体来说,是一个函数),我们可以将其用作key参数:

>>> names = ["Rishikesh", "aman", "Ajay", "Hemkesh", "sandeep", "Darshan", "Virendra", "Shwetabh"]
>>> names2 = sorted(names)
>>> names2
['Ajay', 'Darshan', 'Hemkesh', 'Rishikesh', 'Shwetabh', 'Virendra', 'aman', 'sandeep']
>>> # Let's use a lambda to get a case-insensitive sort:
>>> names3 = sorted(names, key=lambda name:name.lower())
>>> names3
['Ajay', 'aman', 'Darshan', 'Hemkesh', 'Rishikesh', 'sandeep', 'Shwetabh', 'Virendra']
>>>

13

Lambda 可以是任何函数。如果你有一个函数

def compare_person(a):
         return a.age

您可以像这样对年龄属性进行排序,以对个人列表进行排序:
sorted(personArray, key=compare_person)

这样,列表将按年龄升序排序。

你的示例中包含“lambda”,因为Python有一个巧妙的lambda关键字,用于动态定义此类函数。您可以不定义compare_person函数并将其传递给sorted,而是可以编写以下内容:

sorted(personArray, key=lambda a: a.age)

它执行相同的操作。


4
 >>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower())

实际上,上述代码可以是:

>>> sorted(['Some','words','sort','differently'],key=str.lower)

根据https://docs.python.org/2/library/functions.html?highlight=sorted#sorted,key指定一个接受一个参数的函数,用于从每个列表元素中提取比较关键字:key=str.lower。默认值为None(直接比较元素)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接