Python 代码中的“lambda”是什么?它如何与“sorted”、“sum”等的“key”参数一起工作?

2025-02-20 09:24:00
admin
原创
61
摘要:问题描述:我看到了一些使用内置函数的例子,比如sorted,sum等等key=lambda。这里是什么lambda意思?它是如何工作的?有关 lambda 的一般计算机科学概念,请参阅什么是 lambda(函数)?。另请参阅lambda 有何用处?了解一些不再符合站点标准但您可能会觉得有用的讨论。解决方案 1...

问题描述:

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

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


有关 lambda 的一般计算机科学概念,请参阅什么是 lambda(函数)?。

另请参阅lambda 有何用处?了解一些不再符合站点标准但您可能会觉得有用的讨论。


解决方案 1:

Alambda是一个匿名函数:

>>> 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另一方面,A可以在sorted()表达式中直接内联指定:

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

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

Python 库中有很多地方(包括内置函数)都接受可调用函数作为关键字或位置参数。这里就不一一列举了,而且它们通常发挥着不同的作用。

解决方案 2:

在 Python 中,是用于定义匿名函数(即没有名称的函数)的lambda关键字,有时也称为lambda 函数(源自 关键字 ,而 又源自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

但是,通过使用keyfor ,我们可以根据对每个值应用函数的结果对值进行排序:sorted`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']
>>>

解决方案 3:

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3930  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2729  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   67  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   74  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   60  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用