函数是什么,大家都懂,就是一种特殊的映射,关系的表达式,在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!