Python匿名函数lambda最详解
一、匿名函数介绍
在Python中,不通过def来声明函数名字,而是通过lambda关键字来定义的函数称为匿名函数。
二、匿名函数的特点
- lambda函数不能声明函数名
- 普通函数的声明:
def 函数名(): 函数体
- lambda函数的声明:
lambda 参数:表达式
- lambda函数能接收任何数量(包括0)的参数,结果返回的是一个lambda函数对象
#没有参数 >>>print(lambda :2+5) #执行结果: >>><function <lambda> at 0x000001A89755A558> #有参数 >>>print(lambda a,b: a+b) >>><function <lambda> at 0x000002137EE7AB88>
- lambda函数是一个函数对象,直接赋值给一个变量,这个变量就成了一个函数对象。
>>>result = lambda :2+5 >>>print(result) #执行结果: >>><function <lambda> at 0x0000014A0464AB88>
- lambda函数即用即创建,用完就立即执行垃圾回收,因为一个lambda函数永远不可能被多个对象同时引用。
- 可以在使用函数的同时,使用lambda,可以将lambda作为函数的参数或返回值。
def demo(d=(lambda x: x+1)): return "这是一个入参是lambda的demo" print(demo(d=(1))) 执行结果: 这是一个入参是lambda的demo
- 可以配合python的一些内置函数,直接使用,提高代码的可读性。
for i in map(lambda x: x + 1, [1, 2, 3]): print(i) 执行结果: 2 3 4
三、语法介绍
【语法】:lambda 参数:表达式
- 先写lambda关键字,有些参数名(若是参数可以忽略不写)
- 多个参数用逗号隔开
- 在参数后面冒号,后则写返回的表达式
def demo(y): result = lambda x: x+1 return result(y) print(demo(2)) 执行结果: 3
四、实例演示
- 匿名函数与普通函数的对比
def add_demo(a, b): return a+b add_lam = lambda a,b: a+b print(add_demo(1,2)) print(add_lam(1,2)) 运行结果: 3 3
- 匿名函数的多种形式
# 参数个数为0 lambda_0 = lambda: 1 + 2 # 参数个数为2 lambda_2 = lambda a, b: a + b print(lambda_0()) print(lambda_2(1, 2)) 运行结果: 3 3
可以看到,lambda的参数可以0个到多个,但是最后的值只有一个
- lambda作为一个参数传递
def sub_func(a, b, func): print('a =', a) print('b =', b) print('a - b =', func(a, b)) sub_func(100, 1, lambda a, b: a - b) 运行结果: a = 100 b = 1 a - b = 99
上面的代码中,sub_func中需要传入一个函数,然后这个函数在sub_func里面执行,这时候我们就可以使用lambda函数,因为lambda就是一个函数对象。
- lambda函数与Python内置函数配合使用
peoples = [ {"name": "张三", "age": 100}, {"name": "王五", "age": 89}, {"name": "李四", "age": 120} ] new_peoples = sorted(peoples, key=lambda x: x["age"]) num_sum = reduce(lambda x, y: x + y, range(1, 101)) print(new_peoples) print(num_sum) 执行结果: [{'name': '王五', 'age': 89}, {'name': '张三', 'age': 100}, {'name': '李四', 'age': 120}] 5050
- lambda作为函数的返回值
def run_func(a, b): return lambda c: a + b + c return_func = run_func(1, 10000) print(return_func) print(return_func(100)) 运行结果: <function run_func.<locals>.<lambda> at 0x00000254E4C94158> 10101 或者 def demo(a,b): return lambda d: (a*b*d) print(demo(1,2)(3)) 执行结果: 6
匿名函数可以作为一个函数的返回值,在上面的代码中,run_func返回的是一个匿名函数,返回的是一个函数对象,当我们执行这个函数时,可以得到lambda函数的结果。
注意:
其中的a,b两个参数是run_func中的参数,但我们执行返回的函数return_func时,已经不在run_func的作用域内了,而lambda函数仍然能使用a,b参数。说明lambda函数会将它的运行环境保存一份,一直保留到它自己执行的时候使用。