一、什么是高阶函数
我们可以用一个示例来理解高阶函数: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函数
- 使用reduce函数首先需要导入模块:“from functools import reduce”;
- reduce函数是把传入的函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,
- 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]