因为自己也是一个小白,所以对map和reduce也不能很好的理解。如果有错误还是希望高手能够指出~
最近看到一个很有意思的比喻,就是说做一个三明治。map是把所有的原材料加工的方法,比方说胡萝卜洗干净处理好,面包做成面包片,洋葱切成片等等,把原来的东西换个形式,但还是和以前一样是个单独的个体;reduce就是把处理完的食品加工到一起,变成了一个三明治哈哈。
首先对于map函数:
map()有两个参数,第一个是模板函数,第二个是可迭代的数据,可以是字符串、元组和列表等。
例如:
t = map(int,'1234')
print(list(t))
结果则是
[1,2,3,4]
即map函数会对序列中的每个元素做目标函数的操作,然后返回一个可迭代的数据。
然后对于reduce函数:
和map函数一样,reduce同样是两个输入参数,第一个是目标函数,第二个是数据。
和map函数不同的是,reduce的目标函数需要有两个输入参数,而且reduce函数返回的数据是作用在所有数据之间的计算结果,不是像map函数一样孤立的处理单独的数据。这么说可能有点不太严谨。可以拿例子说明一下:
reduce(f,[x1,x2,x3]) = f(f(x1),x2),x3)
然后在廖雪峰的教程底下有三道习题,这里贴上我写的方法:
#1、map函数实现将列表中的所有字符串首字母变成大写
def normalizer(x):
# for i in x:(这里不需要用for循环,傻了)
return str.upper(x[0])+str.lower(x[1:])
def normalize(x):
return map(normalizer,x)
#2、编写一个prod()函数,可以接受一个list并利用reduce()求积:
from functools import reduce
def times(x,y):
return x*y
def prod(x):
return reduce(times,x)
#3、# 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456
from functools import reduce
def mix(a,b):
return 10*a+b
def flo(x):
return map(float,x)
def str2float(x):
index = x.find('.')#取到小数点所在的下标/索引
a = x[0:index]#小数点之前的则为整数部分
b = x[index+1:]#小数点之后的则为小数位份
s = len(b)
return reduce(mix,flo(a))+reduce(mix,flo(b))*10**(-1*s)