1、lambda是什么?
lambda表达式在许多语言中都出现过,Java8中lambda作为新特性而出现,如下:
// 接收一个参数,返回其平方数
x -> x * x
// 接受2个参数,返回他们的乘积
(x, y) -> x * y
Python中的lambda表达式如下:
f = lambda x: x**2 # 数字乘方
print(f(5))
x = lambda x: x.split(' ') # 字符分割
print(x('x ss vv bbn l'))
从上面可以发现lambda表达式的一个重要特点:简洁性。这是使用它的一个重要原因。
lambda表达式又经常被称为lambda函数、匿名函数,他实际上就是一个简化版的函数,简化到什么程度呢?甚至连函数名都简化没了。
在Python中定义lambda表达式:f = lambda x: x**2
冒号左边的参数(此处是x)函数的参数列表,可以一个或多个参数。
冒号的右边相当于 return [表达式] 。(注意:冒号右边的表达式不宜过于复杂,否则就与其简洁性背道而驰了,如果确实需要复杂的逻辑,建议使用函数)
而f则是这个函数的函数引用或者句柄,有的小伙伴可能就说了:“那f不就成了函数名了吗?” 都错,此时f就是这个匿名函数的函数名了,因为调用时f(5)就是函数的调用方式。
所以这个lambda函数与下面的函数等价:
def f(x):
return x**2
甚至在执行效率上二者都相差无几,读者可以自己测试或者查阅其他资料。
2、lambda表达式作为函数的入参
下面是列表的sort方法,传给参数key的是一个lambda匿名函数:
l = [(2, 9),(4, 6),(5, 3)]
l.sort(key=lambda x: x[1])
print(l) # [(5, 3), (4, 6), (2, 9)]
l.sort(key=lambda x: x[0])
print(l) # [(2, 9), (4, 6), (5, 3)]
这个lambda函数告诉sort函数用列表项中的哪个参数来作为排序依据,因为开发中我们遇到的排序元素很可能比这个复杂的多,比如下面这个:
l = [{'name': 'hanmeimei', 'age': 18, 'book': {'name': '探索自然', 'price': 37.9}},
{'name': 'lilei', 'age': 17, 'book': {'name': '国家地理', 'price': 30.0}},
{'name': 'xiaoxin', 'age': 19, 'book': {'name': '高等数学', 'price': 45.5}}]
l.sort(key=lambda x: x['name']) # 按名字排序
print(l)
# [{'name': 'hanmeimei', 'age': 18, 'book': {'name': '探索自然', 'price': 37.9}},
# {'name': 'lilei', 'age': 17, 'book': {'name': '国家地理', 'price': 30.0}},
# {'name': 'xiaoxin', 'age': 19, 'book': {'name': '高等数学', 'price': 45.5}}]
l.sort(key=lambda x: x['book']['price']) # 按每个人的书籍的价格排序
print(l)
# [{'name': 'lilei', 'age': 17, 'book': {'name': '国家地理', 'price': 30.0}},
# {'name': 'hanmeimei', 'age': 18, 'book': {'name': '探索自然', 'price': 37.9}},
# {'name': 'xiaoxin', 'age': 19, 'book': {'name': '高等数学', 'price': 45.5}}]
这时候我们就能感受到这个lambda函数的好处了,不仅能够简洁的指定排序依据,还能让排序函数忽略掉列表内部的元素结构,简洁清爽
最后我们实现一个以lambda函数作为参数的冒泡排序函数:
l = [{'name': 'hanmeimei', 'age': 18, 'book': {'name': '探索自然', 'price': 37.9}},
{'name': 'lilei', 'age': 17, 'book': {'name': '国家地理', 'price': 30.0}},
{'name': 'xiaoxin', 'age': 19, 'book': {'name': '高等数学', 'price': 45.5}}]
def my_sort(data_list, key=lambda x: x):
for i in range(len(data_list)):
for k in range(len(data_list) - i - 1):
if key(data_list[k]) > key(data_list[k+1]):
data_list[k], data_list[k + 1] = data_list[k + 1], data_list[k]
return data_list
print(my_sort(l, key=lambda x: x['book']['price'] ))
# [{'name': 'lilei', 'age': 17, 'book': {'name': '国家地理', 'price': 30.0}},
# {'name': 'hanmeimei', 'age': 18, 'book': {'name': '探索自然', 'price': 37.9}},
# {'name': 'xiaoxin', 'age': 19, 'book': {'name': '高等数学', 'price': 45.5}}]
同样能达到Python内置函数sort的排序效果。