Python代码中的lambda是什么?它如何使用`key`参数来`sorted`,`sum`等,?

91zkwejq  于 2023-04-28  发布在  Python
关注(0)|答案(4)|浏览(201)

我看到了一些使用内置函数的例子,如sortedsum等。使用key=lambda
lambda是什么意思它是如何工作的?
关于lambda的一般计算机科学概念,参见What is a lambda (function)?
另请参阅How are lambdas useful?,了解一些不再符合站点标准但您可能会发现有用的讨论。

3phpmpom

3phpmpom1#

lambda是一个匿名函数:

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

它经常用于像sorted()这样的函数中,这些函数将可调用对象作为参数(通常是key关键字参数)。你可以提供一个现有的函数,而不是lambda,只要它是一个可调用的对象。
sorted()函数为例。它将按排序顺序返回给定的iterable:

>>> 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库中有很多地方,包括内置函数,它们将可调用作为关键字或位置参数。这里有太多的名字,他们经常扮演不同的角色。

oknwwptz

oknwwptz2#

在Python中,lambda是一个关键字,用于定义 * 匿名函数 *(i.即没有名字的函数),有时称为 *lambda函数 *(在关键字之后,该关键字又是from theory)。
让我们看一些例子:

>>> # 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创建了一个 callable(具体地说,是一个函数),我们可以为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']
>>>
bprjcwpo

bprjcwpo3#

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

def compare_person(a):
         return a.age

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

sorted(personArray, key=compare_person)

这样,列表将按年龄升序排序。
示例中包含了“lambda”,因为Python有一个漂亮的lambda关键字,用于动态定义此类函数。除了定义一个函数compare_person并将其传递给sorted,你还可以这样写:

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

也是一样的

3hvapo4f

3hvapo4f4#

>>> 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(直接比较元素)。

相关问题