一、匿名函数
1)什么是匿名函数?
我们之前定义函数,都会讲函数名与函数的内存地址绑定,便于后续调用,为了方便对比,我们暂且叫这种函数为“有名函数”;匿名函数顾名思义,不会定义名字的函数,从函数的定义与调用来看,匿名函数注定在代码运行后无法再被调用,即“一次性”,正式这种特性决定了匿名函数的特殊用途
匿名函数语法如下:
lambda 参数1,参数2,...: expression # 等价于 def f1(参数1,参数2....): 函数体 return 返回值
示例:
# 计算三个数之和的函数 # def 定义 def f1(x, y, z): res = x + y + z return res f1(1, 2, 3) # 返回6 # 匿名函数 lambda x, y, z: x + y + z # 调用匿名函数 res = (lambda x, y, z: x + y + z)(1,2,3) # 后面加括号即传参调用,返回6
2)匿名函数与其他函数运用
因为匿名函数没有函数名,所以他的引用计数一直为0,所以一经调用结束就会被当做垃圾清除,所以应用在“一次性场景下”
# 匿名函数与max函数 # 按照字典的值取到最大的值对应的key dic = {"kkk": 1, "hhh": 2, "jjj": 3} res = max(dic) # 如果只指定比较参数,那么默认按照key值比较 print(res) # 返回"kkk" # 函数max会迭代字典salaries,每取出一个“人名”就会当做参数传给指定的匿名函数, # 然后将匿名函数的返回值当做比较依据,最终返回薪资最高的那个人的名字 res1 = max(dic, key=lambda k: dic[k]) print(res1)
二、内置函数:map、reduce、filter
1、map:map函数可以接收两个参数,一个是函数,另外一个是可迭代对象,map会依次迭代array,得到的值依次传给匿名函数(也可以是有名函数),而map函数得到的结果仍然是迭代器。
list1 = [1, 2, 3, 4, 5, 6] res = map(lambda x: x + 1, list1) print(res) res.__next__() # 迭代器对象
2、reduce函数:可以接收三个参数,一个是函数,第二个是可迭代对象,第三个是初始值
1 没有初始值,reduce函数会先迭代一次array得到的值作为初始值,作为第一个值数 传给x,然后继续迭代一次array得到的值作为第二个值传给y,运算的结果为3
2 将上一次reduce运算的结果作为第一个值传给x,然后迭代一次array得到的结果作为第二个值传给y,依次类推,知道迭代完array的所有元素,得到最终的结果15
也可以为reduce指定初始值
# reduce from functools import reduce list1 = [1, 2, 3, 4, 5, 6] res = reduce(lambda x, y: x * y, list1, 9) print(res) # 第一步,初始值x=9,迭代取到一个值y=1,运算得到9*1,赋值给x # 第二步,x=9,迭代取到一个值y=2,运算得到9*2,赋值给x=18 # 第三步,x=18,迭代取到一个值y=3,运算得到18*3,赋值给x=54 # 第四步,x=54,迭代取到一个值y=4,运算得到54*4,赋值给x=216 # 第五步,x=216,迭代取到一个值y=5,运算得到216*5,赋值给x=1080 # 第六步,x=1080,迭代取到一个值y=6,运算得到1080*6,赋值给x=64800
原文:https://www.cnblogs.com/zhangchengchao123/p/14603371.html