Python匿名函数lambda的使用

论坛 期权论坛 期权     
Python 碎片   2019-6-30 06:58   2461   0

一、匿名函数介绍

在Python中,不通过def来声明函数名字,而是通过lambda关键字来定义的函数称为匿名函数。

lambda函数能接收任何数量(可以是0个)的参数,但只能返回一个表达式的值,lambda函数是一个函数对象,如果直接赋值给一个变量,这个变量就成了一个函数对象。

语法:lambda 参数:表达式

先写lambda关键字,然后依次写匿名函数的参数,多个参数中间用逗号连接,然后是一个冒号,冒号后面写返回的表达式。

使用lambda函数可以省去函数的定义,不需要声明一个函数然后使用,而可以在写函数的同时直接使用函数。

使用场景:
1.需要将一个函数对象作为参数来传递时,可以直接定义一个lambda函数(作为函数的参数或返回值)

2.要处理的业务符合lambda函数的情况(任意多个参数和一个返回值),并且只有一个地方会使用这个函数,不会在其他地方重用,可以使用lambda函数

3.与一些Python的内置函数配合使用,提高代码的可读性




二、匿名函数与普通函数的对比
  1. def sum_func(a, b, c):
复制代码
  1.     return a + b + c
复制代码
  1. [/code][code]
复制代码
  1. sum_lambda = lambda a, b, c: a + b + c
复制代码
  1. [/code][code]print(sum_func(1, 100, 10000))
复制代码
  1. print(sum_lambda(1, 100, 10000))
复制代码
运行结果:
  1. 10101
复制代码
  1. 10101
复制代码
可以看到,lambda适用于多个参数、一个返回值的情况,可以用一个变量来接收,变量是一个函数对象,执行这个函数对象的结果与执行一个普通函数的结果一样。

lambda函数比普通函数更简洁,且没有声明函数名,上面的代码是用一个变量来接收lambda函数返回的函数对象,并不是lambda函数的名字。




三、匿名函数的多种形式
  1. # 无参数
复制代码
  1. lambda_a = lambda: 100
复制代码
  1. print(lambda_a())
复制代码
复制代码
  1. # 一个参数
复制代码
  1. lambda_b = lambda num: num * 10
复制代码
  1. print(lambda_b(5))
复制代码
复制代码
  1. # 多个参数
复制代码
  1. lambda_c = lambda a, b, c, d: a + b + c + d
复制代码
  1. print(lambda_c(1, 2, 3, 4))
复制代码
复制代码
  1. # 表达式分支
复制代码
  1. lambda_d = lambda x: x if x % 2 == 0 else x + 1
复制代码
  1. print(lambda_d(6))
复制代码
  1. print(lambda_d(7))
复制代码
运行结果:
  1. 100
复制代码
  1. 50
复制代码
  1. 10
复制代码
  1. 6
复制代码
  1. 8
复制代码
可以看到,lambda的参数可以0个到多个,并且返回的表达式可以是一个复杂的表达式,只要最后的值是一个值就行了。



四、lambda作为一个参数传递
  1. def sub_func(a, b, func):
复制代码
  1.     print('a =', a)
复制代码
  1.     print('b =', b)
复制代码
  1.     print('a - b =', func(a, b))
复制代码
复制代码
复制代码
  1. sub_func(100, 1, lambda a, b: a - b)
复制代码
运行结果:
  1. a = 100
复制代码
  1. b = 1
复制代码
  1. a - b = 99
复制代码
上面的代码中,sub_func中需要传入一个函数,然后这个函数在sub_func里面执行,这时候我们就可以使用lambda函数,因为lambda就是一个函数对象。




五、lambda函数与Python内置函数配合使用
  1. member_list = [
复制代码
  1.     {"name": "风清扬", "age": 99, "power": 10000},
复制代码
  1.     {"name": "无崖子", "age": 89, "power": 9000},
复制代码
  1.     {"name": "王重阳", "age": 120, "power": 8000}
复制代码
  1. ]
复制代码
  1. new_list = sorted(member_list, key=lambda dict_: dict_["power"])
复制代码
  1. print(new_list)
复制代码
复制代码
复制代码
  1. number_list = [100, 77, 69, 31, 44, 56]
复制代码
  1. num_sum = list(map(lambda x: {str(x): x}, number_list))
复制代码
  1. print(num_sum)
复制代码
运行结果:
  1. [{'name': '王重阳', 'age': 120, 'power': 8000}, {'name': '无崖子', 'age': 89, 'power': 9000}, {'name': '风清扬', 'age': 99, 'power': 10000}]
复制代码
  1. [{'100': 100}, {'77': 77}, {'69': 69}, {'31': 31}, {'44': 44}, {'56': 56}]
复制代码
上面的sorted是Python中对列表排序的内置函数,我们使用lambda来获取排序的key。

map是Python中用来做映射的一个内置函数,接收两个参数,第一个参数是一个函数,第二个参数是一个可迭代对象,map会遍历可迭代对象的值,然后将值依次传递给函数执行。我们使用lambda来实现map中的函数参数。




六、lambda作为函数的返回值
  1. def run_func(a, b):
复制代码
  1.     return lambda c: a + b + c
复制代码
复制代码
复制代码
  1. return_func = run_func(1, 10000)
复制代码
  1. print(return_func)
复制代码
  1. print(return_func(100))
复制代码
运行结果:
  1. [/code][code]10101
复制代码
匿名函数可以作为一个函数的返回值,在上面的代码中,run_func返回的是一个匿名函数,返回的是一个函数对象,当我们执行这个函数时,可以得到lambda函数的结果。

注意:其中的a,b两个参数是run_func中的参数,但我们执行返回的函数return_func时,已经不在run_func的作用域内了,而lambda函数仍然能使用a,b参数。说明lambda函数会将它的运行环境保存一份,一直保留到它自己执行的时候使用。



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:15
帖子:3
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP