map() reduce()
1 高阶函数
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
1 def f01(x, y) : 2 return x * y 3 4 def f02(x, y, f) : # 函数名作为参数 5 return f01(x, y) 6
2 map()
map()
函数接收两个参数,一个是函数,一个是Iterable
,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。
1 def f03(x) : 2 return x + 1 3 a = [1,2,3] 4 print('map()前',a) 5 a = list(map(f03, a)) # 利用map()给a列表的每个元素进行+1操作 6 print('map()后', a)
注意:map()
传入的第一个参数是f
,即函数对象本身。由于结果r
是一个Iterator
,Iterator
是惰性序列,因此通过list()
函数让它把整个序列都计算出来并返回一个list。
3 reduce()
reduce
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
1 def f01(x, y) : 2 return x * y 3 b = [1,2,3,4] 4 from functools import reduce 5 b = reduce(f01, b) 6 print('reduce()后的结果', b) 7 # 运行结果: reduce()后的结果 24
4 map() 和 reduce()的综合应用
1 def str_float(s) : 2 def str_num(s) : 3 return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] 4 5 n = s.index('.') # 计算 . 在字符串中的位置 6 7 str01 = s[0:n] + s[n+1:] # 用于存储除去 . 过后的字符串 8 print(str01) 9 print('str01_type', type(str01)) 10 11 lis01 = list(map(str_num, str01)) # 将去除 . 过后的字符串变成列表,并存放在lis01中 12 print(lis01) 13 print('lis01_type', type(lis01)) 14 15 p = len(s) - n - 1 # 计算 . 后面还有多少位数字 16 17 def num_int(x, y) : 18 return (x * 10) + y 19 from functools import reduce 20 return reduce(num_int, lis01) / pow(10, p) 21 a = '12.123' 22 print('前', type(a), a) 23 a = str_float(a) 24 print('后', type(a), a)