什么是’lambda’在 Python 代码? 它如何与’键’参数’排序’,’和’等工作?

我看到了一些使用内置函数的例子,比如使用 key=lambdasortedsum等等。

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


对于通用的计算机科学概念的一个 lambda,参见 什么是 lambda (函数) ?

150264 次浏览

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

另一方面,可以在 sorted()表达式中直接内联地指定 lambda:

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

Lambdas 仅限于一个表达式,其结果是返回值。

Python 库中有很多地方,包括内置函数,都将可调用性作为关键字或位置参数。这里有太多的名字,他们经常扮演不同的角色。

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

def compare_person(a):
return a.age

您可以像下面这样对 Person (每个 Person 都有一个 age 属性)列表进行排序:

sorted(personArray, key=compare_person)

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

这个参数被称为 lambda,因为 python 有一个漂亮的 lambda 关键字用于动态定义这样的函数。不需要定义一个比较人员函数并将其传递给排序,您还可以编写:

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

它们的作用是一样的。

 >>> 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。默认值为 Nothing (直接比较元素)。

在 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

然而,通过对 sorted使用 key,我们可以对每个值应用 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']
>>>