python:浅析(lambda)匿名函数
1、什么是匿名函数
所谓匿名,意即不能再使用 def 关键字来创建这种标准形式的函数,而是使用lambda关键字创建的函数被称之为匿名函数,也就是大众所知的lambda表达式,而使用def关键字创建的函数则称之为标准函数。
2、语法格式
lambda 参数1,参数2……参数n :表达式
# 注意:lambda 是一个单一的表达式,而不是语句块
3、特点:
1. lambda函数可以接收任意数量和任意类型的参数,但只能有一个表达式,仅仅只能lambda表达式中封装有限的代码逻辑,所以说匿名函数要比标准函数简单的多
2. lambda函数不能访问 除 自己参数列表外的全局变量
3. lambda表达式默认会返回一个值,所以不需用return返回
4. lambda函数没有函数名
5. lambda函数可以作为参数传递
4、使用场景
-
函数内体只有一条语句 或者说 这个函数的作用比较简单就是对两个数进行运算,或者说要找某个可迭代对象中符合条件的元素,那么就可以使用lambda函数,并有需求的话可以配合高阶函数使用
案例:
# 【1】匿名含糊的基本操作 # 需求:要计算a和b的和 sum1 = lambda a,b:a+b print(sum1(10,20)) # 【2】匿名函数配合高阶函数使用 # 需求求出1-100之间的所有偶数,配合使用filter函数使用 # 先使用列表推导式,创建一个包含1-100的列表 my_list = [i for i in range(1,101)] # 再通过filter函数,拿出符合条件的列表 ret = filter(lambda a:a % 2 == 0,my_list) print(ret)
-
如果该函数比较简单,要作为另一个函数的参数进行传递,那么就可以使用匿名函数
案例:
# 【1】在函数调用时创建匿名函数
# 需求:通过一个标准函数调用匿名函数
def func(func_name,a,b):
# 在函数内调用匿名函数,并返回结果
sum1 = func_name(a,b)
print(sum1)
# 调用函数,并将匿名函数传递,并传入两个关键字参数
func(lambda a,b:a+b,a=20,b=30)
# 【2】在全局变量中提前定义好匿名函数
def func(func_name,a,b):
# 在函数内调用匿名函数,并返回结果
sum1 = func_name(a,b)
print(sum1)
# 在全局变量中声明定义匿名函数,并将引用地址赋值给这个变量
func_name = lambda a,b:a+b
# 调用函数,并将匿名函数的引用地址传递,并传入两个关键字参数
func(func_name,a=20,b=30)
注意:
这里出于性能的原因,我更推荐大家使用方法1,就是在函数调用的时候直接将匿名函数作为参数传递,而不是先在全局定义变量,再传递。这样做的原因:当程序加载全局中的匿名函数将创建,等待调用传递,然后等到程序结束才释放全局的内存,所以如果匿名函数直接作为参数传递,那么在该函数调用完成之后,局部变量就自动释放内存,所以说,将匿名函数直接作为参数传递会程序运行效率会更高。
5、在sort函数中的运用
众所周知,sort函数是列表中用于排序的,想必大家都会使用sort函数对一维列表进行排序,语法如下:
# 【1】要进行排序的列表
my_list = [1,8,7,3,0,4]
# 【2】使用sort函数,并且参数是reverse = True或者False,默认False是从小到大排列,True是从大到小排列
my_list.sort(reverse=True)
# 【3】输出排好的列表
print(my_list)
但如果是二维列表,或者说列表嵌套元组、字典那该怎么办?其实sort还有一个参数key,key接收的是一个要有返回的只有一个形参的函数,那么这个函数我们就可以用匿名函数代替,表达式是你要比较的一列数据,表示此元素的权值,sort将按照权值大小进行排序
# 列表字典嵌套排序
my_list = [
{"name":"小明","age":18},
{"name":"小黄","age":16},
{"name":"小猪","age":25},
{"name":"小梅","age":10},
]
# 前提是各个元素都要有这个值
my_list.sort(key=lambda a:a["age"])
# 如果是列表嵌套列表,那么就根据二维列表的哪一个元素进行排,元素类似
# 最后输出排好的列表
print(my_list)