如果编程语言 Python 的作者 Guido van Rossum 有他的意愿,我们的教程中就会缺少这一章。在他 2005 年 5 月的文章“一切 Pythonic:Python 3000 中 reduce() 的命运”中,他给出了放弃 lambda、map()、filter() 和 reduce() 的原因。他预计会遭到 Lisp 和“伙计们”的抵制。令他没想到的是,这种对立的僵硬。差不多一年后,Guido van Rossum 写道:“经过这么多次为 lambda 提出替代方案的尝试之后,也许我们应该承认失败。我没有时间关注最近几轮,但我建议我们保留 lambda,以免在不可能的任务上浪费每个人的才能和时间。” 我们可以看到结果:lambda、map() 和 filter() 仍然是核心 Python 的一部分。只有reduce() 必须去;它移动到模块 functools 中。
他放弃他们的理由是这样的:
- 有一个同样强大的替代 lambda、过滤器、映射和缩减,即列表理解
- 列表理解(更明显,更容易理解
- 同时拥有列表理解和“过滤、映射、缩减和 lambda”正在违背 Python 的座右铭“应该有一种明显的方法来解决问题”
有些人喜欢它,有些人讨厌它,许多人害怕 lambda 运算符。lambda 运算符或 lambda 函数是一种创建小型匿名函数(即没有名称的函数)的方法。这些函数是一次性函数,即它们只在创建的地方需要。Lambda 函数主要与 filter()、map() 和 reduce() 函数结合使用。由于 Lisp 程序员的需求,lambda 特性被添加到 Python 中。
lambda 函数的一般语法非常简单:
lambda 参数列表:表达式
参数列表由逗号分隔的参数列表组成,表达式是使用这些参数的算术表达式。您可以将函数分配给变量以为其命名。
以下 lambda 函数示例返回其两个参数的总和:
sum = lambda x , y : x + y
sum ( 3 , 4 )
输出:
7
上面的例子可能看起来像是数学家的玩具。一种形式主义,它把一个容易理解的问题变成一个抽象的更难理解的形式主义。最重要的是,我们可以通过使用以下常规函数定义来获得相同的效果:
def sum ( x , y ):
返回 x + y
sum ( 3 , 4 )
输出:
7
我们可以向您保证,当您学会使用 map() 函数时,这种方法的优势将是显而易见的。
map() 函数
正如我们之前提到的,当与 map() 函数结合使用时,可以看出 lambda 运算符的优势。map() 是一个带有两个参数的函数:
r = 地图(功能,序列)
第一个参数 func 是一个函数的名称,第二个参数是一个序列(例如一个列表)seq。map() 将函数 func 应用于序列 seq 的所有元素。在 Python3 之前,map() 用于返回一个列表,其中结果列表的每个元素都是函数 func 应用于列表或元组“seq”的相应元素的结果。在 Python 3 中, map() 返回一个迭代器。
下面的例子说明了 map() 的工作方式:
def 华氏度( T ):
return (( float ( 9 ) / 5 ) * T + 32 )
def celsius ( T ):
return ( float ( 5 ) / 9 ) * ( T - 32 )
温度 = ( 36.5 , 37 , 37.5 , 38 , 39 )
F = 地图(华氏, 温度)
Ç = 地图(摄氏, ˚F )
temperatures_in_Fahrenheit = 列表(地图(华氏, 温度))
temperatures_in_Celsius = 列表(地图(摄氏, temperatures_in_Fahrenheit ))
打印(temperatures_in_Fahrenheit )
打印(temperatures_in_Celsius )
输出:
[97.7, 98.60000000000001, 99.5, 100.4, 102.2]
[36.5, 37.00000000000001, 37.5, 38.00000000000001, 39.0]