lambda函数在最新的PEP(python编码规范)中已经指出不建议使用了,但是因其简介性还是有一定使用价值,今天就来讨论一下lambda函数的用法。

一、简介

lambda函数又称匿名函数,很好理解,就是没有名字的函数。与之对应的就是我们使用def关键字定义的函数,这样定义的函数需要有明确的函数名称,当然为了明确表示函数的作用,我们在定义函数名时需要精雕细琢一下函数名。例如:
defadd_a_and_b(a,b):pass
很明显可以看出函数的功能是求A+B。那匿名函数与显式地定义函数的区别在哪呢?首先显而易见,我们不需要定义函数名就可以进行调用,其次,lambda关键字定义函数有严格的语法,不能使用return等关键字,函数主体只能是1行,所以特别简洁。还是A+B的例子,如果使用def定义,是这样的
def add_a_and_b(a, b): return a + b print(add_a_and_b(1, 2))
而如果使用lambda关键字进行定义,则是
print((lambda a, b: a + b)(1, 2))

二、缺点

既然被PEP所抛弃,一定是有原因的,lambda函数就是这样一个功能强大但弊端特别明显的功能。
首先是他的函数体只能是1行,也就是说他不能定义复杂的函数功能,其实这也不能说是缺点,他本来就是用于处理一行代码可以解决的函数功能的。
其次,不用精心地给函数起名、格式简洁带来地副作用就是代码易读性特别差,来无影去无踪,甚至还需要思考一下返回值是什么东西。
另外,使用lambda关键字定义的函数不能被重复调用,因为在茫茫码海中错过了就找不到了。当然,你可以这样:
add_a_and_b = lambda a, b: a + b >>>print(add_a_and_b(1, 2)) 3
记住!非常不推荐!

三、优点

说了这么多,其实不难发现,lambda函数的优势好像只是把三行实现的功能放在了一行了,貌似也每简化很多。但是lambda函数就像一只虫子,他可以爬到任何位置。例如下面这个例子:
arr = [] for i in range(1, 5): arr.append(i ** 2)
这段代码的功能是生成一个有1-4的平方构成的列表,结果是[1, 4, 9, 16]
lambda函数可以藏在列表里面
arr=list(map(lambdax:x**2,range(1,5)))>>>arr[1,4,9,16]
这个例子不是最好的,因为用列表生成式会更简单。接下来这几个都是类似的用法
1.求1-10间的奇数
arr = list(filter(lambda x: x % 2 != 0, range(1, 11))) >>>arr [1, 3, 5, 7, 9]
2.求1-10的合
from functools import reduce sum = reduce(lambda a, b: a + b, range(1, 11)) >>>sum 55
3.对有多个关键字的元素进行排序
# 将列表以每个元组的第二个元素为关键字进行排序 lists = [(6, 10), (2, 9), (3, 8), (4, 7), (5, 6)] lists.sort(key=lambda x: x[1]) >>>lists [(5, 6), (4, 7), (3, 8), (2, 9), (6, 10)] # 将列表以每个元组的第一个元素为关键字进行排序 lists = [(5, 6), (4, 7), (3, 8), (2, 9), (6, 10)] lists.sort(key=lambda x: x[0]) >>>lists [(2, 9), (3, 8), (4, 7), (5, 6), (6, 10)]
简而言之,如map、reduce、filter之类需要用函数作为参数的用lambda定义映射函数会很简便,代码阅读起来也很流畅。但是,不要经常使用,因为会降低代码的可读性。