一、什么是高阶函数

我们可以用一个示例来理解高阶函数:abs()函数是Python内置的用于获取绝对值的函数,现在对其进行如下操作:

value1  = abs(-10)
print(value1)  #打印10
func1 = abs
value2 = func1(-10)
print(value2)  #打印10

从上面可以看出,函数abs本身可以赋值给变量func1(即变量可以指向函数),而且使用func1的效果与abs函数效果一样;既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

Python中常用的高阶函数有map()reduce()filter()

二、map函数

map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

#示例:将list1中的每个元素进行平方运算得到新的列表
nums1 = [1,2,3,4,5,6]
def square(x):
    return x * x
result1 = map(square,nums1)
list1 = list(result1)
print(list1)  #打印:[1, 4, 9, 16, 25, 36]
1.map结合匿名函数使用
#结合匿名函数改进示例1如下:
nums2 = [1,2,3,4,5,6]
result2 = map(lambda x:x*x,nums2)
list2 = list(result2)
print(list2)  #打印:[1, 4, 9, 16, 25, 36]
2.map函数接收多个序列参数
data_x = [1,2,3,4,5,6,7,8]
data_y =[1,2,3,4,5,6]
result3 = map(lambda x,y: x*2+y, data_x, data_y)
list3 = list(result3)
print(list3)   #打印:[3, 6, 9, 12, 15, 18]

注意1:如果匿名函数参数为多个,map的列表参数也对应多个
注意2:如果多个序列长度不同,以短序列长度为准决定操作次数

三、reduce函数

  1. 使用reduce函数首先需要导入模块:“from functools import reduce”;
  2. reduce函数是把传入的函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,
  3. reduce会把操作结果继续和序列的下一个元素做累积计算,其效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4);
#示例1:求序列和
result4 = reduce(lambda x,y:x+y,[1,2,3,4,5])
print(result4)  #打印:15

#示例2:将序列[1,3,5,7,9]变成整数13579
result5 = reduce(lambda x,y:x*10+y,[1,3,5,7])
print(result5)  #打印:1357

#示例3:假设Python没有提供int()函数,使用reduce函数实现一个把字符串转化为整数的函数
digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def searchNum(s):
    return digits[s]
def transStringToNum(s):
    return reduce(lambda x,y: x*10+y,map(searchNum,s))
result6 = transStringToNum("1234")
print(result6)  #打印:1234

#示例4:reduce函数的第三个参数,初始值
strs = ["Python","Html","OC"]
result7 = reduce(lambda x,y:x+y, strs, "Hello")
print(result7)  #打印:HelloPythonHtmlOC

四、Filter函数

与map()类似,filter()也接收一个函数和一个序列;和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
filte()中的匿名函数必须返回能够判别真假的值

#示例:list中保留奇数,去除偶数
def is_odd(n):
    return n%2 == 1
result8 = filter(is_odd, [1,2,3,4,5,6])
print(list(result8))  #打印[1, 3, 5]