我看到一些使用sorted
、sum
等内置函数的示例,这些函数使用key=lambda
。
lambda
在这里是什么意思?它是如何工作的?
有关lambda的一般计算机科学概念,请参阅什么是lambda(函数)
另请参阅lambdas如何有用?对于一些不再符合网站标准但您可能会觉得有用的讨论
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库中有很多地方,包括内置函数,它们采用可调用的关键字或位置参数。这里有太多的名字,它们往往扮演着不同的角色。
在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']
>>>
Lambda可以是任何函数。所以,如果你有一个功能
def compare_person(a):
return a.age
您可以对Person列表(每个列表都有一个年龄属性)进行排序,如下所示:
sorted(personArray, key=compare_person)
这样,列表将按年龄升序排列。
您的示例包含";λ";因为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。默认值为None(直接比较元素)。