详解Python高阶函数
本文要点
1.什么是高阶函数
2.python中有哪些常用的高阶函数
什么是高阶函数?
在了解什么是高阶函数之前,我们来看几个小例子。我们都知道在python中一切皆对象,函数也不例外。比如求绝对值函数abs,我们可以用一个变量f指向abs函数,那么当调用f()的时候可以得到和abs()一样的效果,这说明变量可以指向函数!
同理我们将abs指向另一个函数abs=len,那么abs将不再是求绝对值的函数了,abs指向的是求长度的len函数。这说明函数名其实就是指向函数的变量!
既然变量可以指向函数,而函数的参数可以接收变量。也就是说一个函数可以接收另一个函数作为参数。下面我们来看一个DEMO。定义一个add函数,它接受三个参数x,y,f,其中x,y是数字,f是一个函数。
defadd(x,y,f): returnf(x)+f(y) result=add(-12,-98,abs) print(result)
输出结果:110
上面的add()函数就是一个高阶函数,其实高阶函数的概念很简单,能接收函数作参数的函数就是高阶函数。
python中常用的高阶函数
1.map()
map()是Python内置的高阶函数,它接收一个函数f和一个list,并通过把函数f依次作用在list的每个元素上,得到一个新的list并返回。
例如,对于list[1,2,3,4,5,6,7,8,9]
如果希望把list的每个元素都作平方,就可以用map()函数:
因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:
defadd(x,y,f): returnf(x)+f(y) result=add(-12,-98,abs) print(result)
输出结果:
[1,4,9,16,25,36,49,64,81]
注意:map()函数不改变原有的list,而是返回一个新的list。
由于list包含的元素可以是任何类型,因此,map()不仅仅可以处理只包含数值的list,事实上它可以处理包含任意类型的list,只要传入的函数f可以处理这种数据类型。
2.reduce()
reduce()函数接收的参数和map()类似,一个函数f,一个list,但行为和map()不同,reduce()传入的函数f必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
下面我们来看个demo:
defprod(x,y): returnx*y print(reduce(prod,[2,4,5,7,12]))
输出结果:3360
prod()函数接收两个参数,返回x和y的乘积
调用reduce(prod,[2,4,5,7,12])时,reduce函数将做如下计算:
先计算头两个元素prod(2,4)结果为:8,
再把计算结果和第3个元素传给prod(8,5)结果为:40,
再把计算结果和第4个元素传给prod(40,7)结果为:280,
再把计算结果和第5个元素传给prod(280,12)结果为:3360,
由于没有更多元素了,最终返回结果:3360
reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:
reduce(prod,[2,4,5,7,12],100)
结果变为:336000,因为第一轮的计算是:
计算初始值和第一个元素:prod(100,2),结果为:200。
3.filter()
filter()又可以叫做过滤函数,它接收一个函数f和一个list,这个函数f的作用是对每个元素进行判断,返回True或False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
例如,要从一个list[1,4,6,7,9,12,17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:
defis_odd(x): ifx%2==1: returnx
然后用filter()过滤掉偶数:
print(list(filter(is_odd,[1,4,6,7,9,12,17])))
结果:[1,7,9,17]
利用filter(),可以完成很多有用的功能,例如,删除None或者空字符串:
defis_not_empty(s): returnsandlen(s.strip())>0 print(list(filter(is_not_empty,['test',None,'','str','','END'])))
以上就是详解Python高阶函数的详细内容,更多关于Python高阶函数的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。