欢迎光临
我们一直在努力

Python lambda函数究竟是什么,lambda函数有什么局限

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_listprint(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的排序效果。

~ END ~ 87043284

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。