目录
缘起
语法
特点
应用
争议
Lambda 是 Python 编程语言中使用频率较高的一个关键字(保留字),常以 lambda 表达式呈现。那么,什么是 lambda 及 lambda 表达式?它有哪些用法?面对众说纷纭,莫衷一是的解释,初学者往往一头雾水,不知所云。
本文尝试抽丝剥茧,逐层揭开 lambda 表达式的面纱,希望有所裨益。
Lambda(音 ['læmdə] ),为第十一个希腊字母,广泛见于数理等科学,如大写 lambda( Λ )为粒子物理学之 Λ 重子符号;小写 lambda( λ )为物理学之波长符号;放射学之衰变常数;线性代数中的特征值等。
喜欢打游戏的都知道,“ λ ”形似一个双手插兜儿,独自行走的人,表示“失意、无奈、孤独、低调、路过”之意,最先流行于半条命( half life )。
此外,Lambda 亦是2019新型冠状病毒变异毒株。2021年6月14日,世界卫生组织发布报告,将最早在秘鲁发现的C.37毒株以 λ 命名,并列为“需要留意”的变异病毒之一。
Lambda 表达式( lambda expression )则基于数学中的 λ 演算得名,直接对应于其中的 lambda 抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数(无需担心被抢注)。用于C#、Java,C++等汇编语言。
在 Python,Lambda 表达式是一类特殊的自定义函数,使用它可以定义一个匿名函数。与其它语言不同,Python 之 Lambda 表达式的函数体只有单独的一条语句,也就是返回值表达式语句。
Python 使用 lambda 来创建匿名函数,其语法如下:
lambda [arg1 [, arg2, ..., argn]] : expression
其中 [arg1 [, arg2, ..., argn]] 为入口参数,expression 为函数体。
示例:
lambda x : x + 1
表达式定义了一个匿名函数,入口参数为 x,函数体为 x + 1。
用函数来表示则为:
def f(x):
return x + 1
可见,lambda 表达式简化了函数定义的形式,优点是使代码更为简洁,为典型的语法糖。缺点是不如函数定义的方式直观,易理解。
作为自定义函数的一种方式,lambda 匿名函数有其独特的特点:
根据应用场景的不同,lambda 表达式可以有不同用法。
其一,作为函数对象,lambda 可赋值给一个变量,再利用变量来调用该函数:
>>> f = lambda x : x + 1
>>> f(5)
6
其二,作为其他函数的返回值,返回函数:
>>> def f(x, y)
return lambada x, y : x ** y
>>> f(3, 5)
. at 0x7f8d54ac20>
其三,作为参数传递给其他函数
部分 Python 内置函数接收 lambda 函数作为参数,如:
>>> l = list(filter(lambda x : x % 2 == 1, range(1, 10)))
>>> l
[1, 3, 5, 7, 9]
>>> l = list(map(lambda x : x ** 2, [1, 2, 3, 4]))
>>> l
[1, 4, 9, 16]
>>> from functools import reduce
>>> reduce(lambda x, y : x + y, [1, 2, 3, 4, 5])
所谓萝卜白菜,各有所爱。lambda 表达式自诞生以来,争议相伴左右。喜欢的人认为使用lambda 编写的代码更紧凑,更“pythonic”,不感冒的人则认为 lambda 表达式不直观且难以理解,能够支持的功能也十分有限,如不支持条件语句/表达式和异常处理程序;在对象遍历方面,也不如 for 循环来得简介,如上述 filter 函数可以写成 l=list(x for x in range(1,10) if x%2==1),等。
一千个人眼中有一千个哈姆雷特,关键看你的取舍了
注:
1、关于语法糖请参见:Python 之语法糖手到擒来的快感https://blog.csdn.net/iprobobo/article/details/123568839
2、关于 map() 函数请参见: Python map() 函数之举重若轻映射的魅力https://blog.csdn.net/iprobobo/article/details/122798133