Python 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_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的排序效果。

~ END ~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值