当前位置: 首页 > 后端技术 > Python

Python中的几个内置高阶函数

时间:2023-03-26 01:47:40 Python

Python有几个内置的高阶函数。python中的一切都可以是一个对象;而高阶函数的意思就是传入的参数包括函数对象,接收函数对象是参数。函数是高阶函数。python中有几个内置的高阶函数,包括map()、sorted()、filter();早期的python版本也有一个内置的reduce(),现在放在functools模块中。map()函数在上一篇文章中已经详细讨论过了。详情请参考https://blog.csdn.net/Always_...补充一点:对于大部分使用map()的场景,已经可以使用lists来替代推导了。对于传入多个参数的情况,一般需要转成下标形式:>>>a=[1,2,3]>>>b=[10,20,30]>>>[a[i]+b[i]foriinrange(3)][11,22,33]sorted()函数中提到sorted()函数必须与sort()函数区分开:sorted()函数是一个内置的Function,它接收一个可迭代对象,根据一定的规则对所有可迭代对象进行排序,并返回一个新的可迭代对象。sort()函数是List对象的一个??方法。直接修改原list返回None>>>a=[2,3,1]>>>b=sorted(a)#returnnewobject>>>b[1,2,3]>>>a#原对象不变[2,3,1]>>>a=[2,3,1]>>>b=a.sort()#ReturnNone>>>a[1,2,3]#改变原来的对象>>>b>>>sort(a)#内置方法只有sorted()Traceback(最近调用last):File"",line1,inNameError:name'sort'未定义,sorted()函数本身非常有用,尤其是与key结合使用时。sorted之所以是高阶函数,是因为它的内部参数可以接收一个函数对象。>>>a=[1,-2,3,-1,10,-2??0]>>>sorted(a)#默认从小到大[-20,-2,-1,1,3,10]>>>sorted(a,reverse=True)#从大到小[10,3,1,-1,-2,-20]>>>sorted(a,key=lambdax:x**2)#key传入一个函数对象,按每个数的平方排序[1,-1,-2,3,10,-20]对于多维列表排序:>>>a=[[2,3,1],[10,-1,3],[-1,20,2]]>>>sorted(a,key=lambdax:x[1])#根据每行的第二个数排序[[10,-1,3],[2,3,1],[-1,20,2]]用于字符串排序:>>>a=['hacca','de','djnhg']>>>sorted(a,key=lambdax:x[-1])['hacca','de','djnhg']对于自定义对象排序:classA:def__init__(self,a,b):self.a=aself.b=bdef__repr__(self):返回'%s_%s_%s'%(self.__class__.__name__,self.a,self.b)>>>x=[A(1,2),A(-1,3),A(-10,1)]>>>sorted(x,key=lambdax:x.a)[A_-10_1,A_-1_3,A_1_2]总之,sorted()函数匹配key使用lambda匿名函数效果很好。filter()函数filter(),顾名思义,就是过滤函数;它接收一个函数和一个可迭代对象,并依次将函数应用于可迭代对象,其中函数每次必须返回True或False。最后,它会将返回的True元素保留下来。>>>a=[1,2,3,4,5]>>>deffunc(x):>>>returnx%2==0>>>list(filter(func,a))#a当2和4传入函数,返回True,所以最后只剩下2和4[2,4]>>>[xforxin[1,2,3,4,5]ifx%2==0]#也可以通过将list压入[2,4]来实现,举个比较复杂的例子。如何判断一个学生是否有偏见?满足以下条件之一的学生将被视为部分科目:2门科目成绩在80分以上,1门科目成绩在60分以下。1门科目成绩在90分以上,另外2门科目成绩在60分以下。1科90分以上,3科平均分70分以下。scores=[("Emma",89,90,59),("Edith",99,49,59),("Sophia",99,60,20),("May",40,94,59),("阿什莉",89,90,59),("阿尼",89,90,69),("露西",79,90,59),("格洛丽亚",85,90,59),("Abby",89,91,90)]defhandle_filter(a):s=sorted(a[1:])#对三个科目的成绩进行排序#有2个科目分数在80以上,1个科目60ifs[-2]>80ands[0]<60:returnTrue#一个科目分数在90以上,另外2个科目在60以下ifs[-1]>90ands[1]<60:returnTrueifs[-2]>80andsum(s)/len(s)<60:#一个科目分数在90以上,3个科目平均分数在70以下returnTruereturnFalse>>>list(filter(handle_filter,scores))[('Emma',89,90,59),('Edith',99,49,59),('May',40,94,59),('Ashley',89,90,59),('Gloria',85,90,59)]可以看出,对于这种复杂的过滤规则,使用列表推导会很麻烦,代码易读性会差一些,而且是此时最好使用过滤器。但它比for循环更好。python3中的reduce()函数已经存在于functools模块中,语法为:reduce(function,sequence[,initial])->valuereduce函数接受一个函数和一个sequence序列,返回一个单一的值,即计算如下:1.最初调用函数,传入序列的前两项,计算结果并返回2.继续调用函数,传入上一步的结果中,然后下一个item用sequence种,计算出结果返回return。重复此操作,直到序列遍历完毕,返回最终结果。笔记。当指定初始值时,传入step1的两个参数分别为初始值和序列的第一项。reduce()最多只能接受三个参数,func、sequence、initial。>>>reduce(lambdaa,b:a+b,[1,2,3,4,5])#传入的第一个值为115>>>reduce(lambdaa,b:a+b,[1,2,3,4,5],100)#传入的第一个初始值为100115reduce这个函数可以换成sum。