前言
今天简单学习了下 lambda 表达式,对其有一些简单的理解。
个人感觉只是写法上的改变,将简单的函数改写为了一句更为简单的表达式,使得代码变得简洁些,但可读性稍微有些降低,代码性能应该是没有影响的。
先来看一段代码示例:
def test1():
lam = lambda x, y: x + y
print(lam(10, 20))
if __name__ == '__main__':
test1()
### 输出30
这样一看其实还是蛮好理解的嗷,就是简单的改变了函数的变现形式,下面我们来做更详细的介绍。
语法
- lambda 表达式的语法只包含一个语句:
lambda [arg1,arg2,.....]:expression
- arg 是用户自定义参数,即一个函数的传入参数,当然咱们也可以不定义参数,即无参数的函数,就像这样
lambda: 10 + 20
- expression 是表达式的内容,即函数内部的处理逻辑
特性
- 匿名函数
即没有函数名的函数,当然你也可以自定义一个变量来指向该函数,就像我在开头写的那个式子一样,当然这并不被推荐。 - 拥有自己的命名空间
不能访问参数列表之外或全局命名空间里的变量,只能完成非常简单的功能。 - 可以进行输入和输入
输入是传入的参数,输出是表达式计算出的结果,比如在下面这例子中,上面的sum函数实际上跟下面 用lambda表达式写的 sum 的含义是一样的,使用方法也是一样的,也包括参数和返回值
def sum(x, y):
return x + y
sum = lambda x, y: x + y
推荐的用法
尽管上面我写的例子大都是用一个变量来引用lambda表达式再去使用,但其实它并不是这么用的,它一般会结合以下四个函数来使用。
-
filter函数
此时lambda函数用于指定过滤列表元素的条件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])
指定将列表 [1,2,3] 中能够 被3整除 的元素过滤出来,其结果是[3]。 -
sorted函数
此时lambda函数用于指定对列表中所有元素进行排序的准则。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
将列表 [1, 2, 3, 4, 5, 6, 7, 8, 9] 按照元素与5距离从小到大进行排序,其结果是 [5, 4, 6, 3, 7, 2, 8, 1, 9]。 -
map函数
此时lambda函数用于指定对列表中每一个元素的共同操作。例如map(lambda x: x+1, [1, 2,3])
将列表 [1, 2, 3] 中的元素分别加1,其结果[2, 3, 4]。 -
reduce函数
此时lambda函数用于指定列表中两两相邻元素的结合条件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
将列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素从左往右两两以逗号分隔的字符的形式依次结合起来,其结果是’1, 2, 3, 4, 5, 6, 7, 8, 9’。
注意
在 PEP 8: E731 中已经指出,如果你在写的 lambda表达式 需要赋给另一个变量,那么请使用 def
而不要使用 lambda,如图:
这是因为这种写法并不能体现 lambda表达式 的特色,基本只是复制 def 的功能,同时这个变量名其实也不是 lambda表达式 真正的函数名,还显得比 def 更容易混淆。
参考
「肖哥shelwin」https://blog.csdn.net/zjuxsl/article/details/79437563
「Nick Peng」https://blog.csdn.net/PY0312/article/details/88956795
「taomeechildren」https://blog.csdn.net/taomeechildren/article/details/120023850