目录
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 只是一个表达式,函数体比 def 简单。
- lambda 的主体是一个表达式,而不是一个代码块。
- 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)
<function f.<locals>.<lambda> at 0x7f8d54ac20>
其三,作为参数传递给其他函数
部分 Python 内置函数接收 lambda 函数作为参数,如:
- filter函数
>>> l = list(filter(lambda x : x % 2 == 1, range(1, 10)))
>>> l
[1, 3, 5, 7, 9]
- list.sort() 及 sorted() 函数。参见:Python 函数 sort(),sorted() 之区别及 key=lambda x:x[] 之理解数据排序
https://blog.csdn.net/iprobobo/article/details/122713695
- map函数
>>> l = list(map(lambda x : x ** 2, [1, 2, 3, 4]))
>>> l
[1, 4, 9, 16]
- reduce函数。此时lambda函数用于指定列表中两两相邻元素的结合条件。
>>> 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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/106920.html