函数是什么,大家都懂,就是一种特殊的映射,关系的表达式,在Python中有简单的函数,在上一篇博文有简单介绍,本篇将介绍高阶函数,其实就是函数的嵌套(本人理解)以及匿名函数和返回函数!
map()和reduce()
- map()
首先我们看map()函数,它比较容易理解,它接收2个参数,一个是函数,一个是Iterable(一种对象类型,可迭代的对象,它里面的元素可以一个个提取出来,如列表,元组等等!)map()里的第一个参数就是函数,它会作用于Iterable里的每一个元素!下面举出实例:
def add(x):
return x*2
m = map(add,[1,2,3])
print(list(m)) #[2,4,6]此时输出的是list型,也可以输出其他的,大家随意而已
print(tuple(m)) #(2,4,6)
- reduce()
接着,我们看reduce()函数,这个函数也是需要2个参数,一个是函数,一个也是一个序列,它和map()的不同之处在于它会一次接收处理2个参数,得到的结果和下一个参数做累积运算!看代码!
from functools import reduce #它需要引入模块
def add(x,y):
return x+y
m = reduce(add,[1,2,3]) #运算过程1+2得出3在加上3得出结果,就是一个滚雪球的过程!
print(n) #6
filter
filter()函数和前2个函数类似,需要2个参数,一个函数一个序列,它的作用是过滤序列!看代码!
def fun(x):
return x%2 =0
m = filter(fun,[1,2,3,4,5,6])
print(list(m)) #[2,4,6] 这段代码就是过滤奇数!
sorted()
sorted()函数我在前面的博文关于 list 的操作里有简单介绍!它是用来排序的函数!一般的排序只是比较元素大小,但是这种比较在字典这种类型的数据就无效了,此时必须通过函数抽象出来。呆子,看代码!
sorted([1,5,2,6]) #[1,2,5,6]默认为升序
sorted([1,3,-9,5],key=abs) #[1,3,5,-9] 此时,key后接一个函数,排序就按照函数的定义进行,显然就是按照绝对值大小进行排序!
sorted(['a','b']) #['a','b']此时按照首字符的ASCLL的大小比较!
sorted([1,3,-9,5],key=abs,reverse=True) #[-9,5,3,1]此时按照key定义的函数进行排序,但是reverse=True表示反转!
注:以上三种函数是高阶函数且是Python的内置函数
匿名函数
匿名函数的提出就是为了避免函数名冲突,不用显式的定义函数,可以直接传入匿名函数!其中,关键字lambda表示匿名函数。
tuple(map(lambda x:x+1,(1,2,3))) #(2,3,4)可以看出lambda的作用其实就是定义了一个函数实现加1的功能!
匿名函数也可以作为一个函数对象赋给一个变量,再来调用!也可以作为返回值!
m = lambda x:x+1
m(1) #2
def fun(x):
return lambda:x+1
返回函数
返回函数是将函数作为返回值返回,也就是返回的不是要的结果,而是一个函数,要想得到结果就再次调用!
def fun(*args):
def add():
x = 0
for i in args:
x = x +i
return x
return add
在这个求和函数中,返回值就是add函数,但是但你调用函数时:
m = fun(1,2,3)
print(m) #会出现错误
print(m()) #6
之所以出现这种情况的原因是因为当我们调用m时其实返回的是add函数,并不是最终的结果,只有在调用m()时才是计算结果!大家脑补一下!
在返回函数中有闭包的概念,这个很重要!俺们看个实例解析!
def fun():
m = []
for i in range(1,3)
def add():
return i +1
m.append(add)
return m
n = fun()
printn((n()) #3
对于出现这个结果大家可能我起初也是诧异的!但是理解一番就OK了!在一个函数中定义了另一个函数,并且在内部函数中调用外部函数的参数或者变量,当我们返回函数时,相关的参数和变量仍然保存在返回的函数中,称之为闭包!
看我们这个程序,有2个循环,但是在调用n()时,返回函数没有立刻执行,也就是说调用n()时,我们的程序之前只是执行到了add函数之外,循环刚刚结束之时,此时的 i 明显就是2了,所以最终的结果是3!