代码环境:python3.6
map/reduce 简单对比
![5f7688c0c88f198a7acb63378e7b1193.png](https://i-blog.csdnimg.cn/blog_migrate/bf3384494272048257f5c9d8a8c17861.png)
map
map 是 python 内置函数,使用方法:map(func, iterable)
,将传入的函数 func 依次作用到 iterable 的每个元素。
举个例子,给出一个序列[1, 2, 3, 4, 5, 6, 7, 8, 9]
,我们要计算出所有元素的平方,用 map 实现如下:
def f(x):
return x * x
def my_map():
return map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
if __name__ == "__main__":
print(my_map())
print(list(my_map()))
# 运行结果:
# <map object at 0x*******>
# [1, 4, 9, 16, 25, 36, 49, 64, 81]
在上面运行结果中,我们需要注意的是,map 返回的结果 iterator 是一个惰性序列,我们需要用 list 函数把序列都计算出来并返回一个 list。
reduce
reduce 在 python2 中是内置函数,在 python3 中被移到 functools,所以使用之前需要先导入,调用方法:reduce(func, sequence)
。
注意:这里的参数老K:python中的sequencezhuanlan.zhihu.comsequence
和 map 的参数iterable
有所不同,详细可参考我前面的文章:
reduce 的作用是把一个函数 f 作用在一个序列[x1, x2, x3, x4, ...]
上,这个函数 f 必须接收两个参数,先计算出 f(x1, x2) 的值,reduce 再把这个结果继续和下一个元素 x3 做累积的计算,以此类推,效果大概如下:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
举个例子,给出一个序列[1, 3, 5, 7]
,我们利用 reduce 求积,代码如下:
from functools import reduce
def prod(x, y):
return x * y
def my_prod(obj_list):
return reduce(prod, obj_list)
if __name__ == "__main__":
print(my_prod())
# 运行结果:
# 105
map/reduce 联合使用
我们利用 map/reduce 编写一个 str2float 函数,把字符串'123.456'
转换成浮点数123.456
(示例仅使用正数)。
from functools import reduce
# 按整数规则累加传参
def reduce_zhengshu(x, y):
return x * 10 + y
# 将字符转为对应整数
def char2int(s):
digits = {
'0': 0,
'1': 1,
'2': 2,
'3': 3,
'4': 4,
'5': 5,
'6': 6,
'7': 7,
'8': 8,
'9': 9
}
return digits[s]
def str2float(my_str):
# 将字符串分割为 整数字符串 和 小数字符串 两部分
my_list = my_str.split('.')
len_num_part2 = len(my_list[1])
# 字符串先用 map 函数映射为一个整数序列,再用 reduce 累加这个序列
num_part1_int = reduce(reduce_int, map(char2int, my_list[0]))
# 先计算出小数字符串部分对应的整数为 456,再转化为真正的小数
num_part2_int = reduce(reduce_int, map(char2int, my_list[1]))
num_part2_decimal = num_part2_int * (10**-len_num_part2)
return num_part1_int + num_part2_decimal
if __name__ == "__main__":
print(str2float('123.456'))
# 运行结果:
# 123.456