详解Python内建函数map()和reduce()

map()和reduce()函数建在Python内。
先看map。map()函数接收两个参数,一个是函数,另一个是Iterable。map依次将传入的函数作用到序列中的每个元素,并将结果作为新的Iterator返回。
现在,我们使用Python代码来实现:
>>>deff(x):...returnx*x ...>>>r=map(f,[1、2、3、4、5、6、7、8、9] >>>list(r) [1,4,9,16,25,36,49,64
map()输入的第一个参数是f,即函数对象本身。因为结果r是Iterator,Iterator是惰性序列,所以通过list()函数计算整个序列并返回list。
您可能会认为,不需要map()函数,也可以通过编写循环来计算结果:
L=[]fornin[1,2,3,4,5,6,7,8]: L.append(f(n)) print(L)
是的,但是,从上面的循环代码可以一眼看出“f”(x)作用于list的每一个元素,并将结果生成新的list吗?
所以,map()作为一个高级函数,它实际上抽象了操作规则,所以我们不仅可以计算简单的f(x)=x2还可以计算任何复杂的函数,例如,将list的所有数字转换为字符串:
>>>list(map(str,[1、2、3、4、5、6、7、8、9]) ['1','2','3','4','5','6','7','8','9']
只需要一行代码。
看看reduce的用法。reduce在一个序列中使用函数[x1, x2, x3, ...]此函数必须接收两个参数,reduce将结果继续和序列的下一个元素进行累积计算,其效果如下:
reduce(f,[x1,x2,x3,x4]=f(f(f(X1,X2),X3),X4)
例如,对于一个序列求和,可以通过reduce来实现:
>>>fromfunctoolsimportreduce >>>defadd(x,y):... returnx+y ... >>>reduce(add,255[1,3,5,7,9]
当然,求和操作可以直接使用Python内建函数sum(),不需要使用reduce。
但如果要把序列[1, 3, 5, 7, 9]转换为整数13579,reduce可以派上用场:
>>>fromfunctoolsimportreduce >>>deffn(x,y): ...returnx*10+y ... >>>reduce(fn,[1,3,5,7,9] 13579
这个例子本身没有多大用处,但是,如果考虑到字符串str也是一个序列,我们可以用map()写一个函数,将str转换为int:
>>>fromfunctoolsimportreduce
>>>deffn(x,y):
...returnx*10+y
...
>>>defchar2num(s):
...digits={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
...returndigits[s]
...
>>>reduce(fn,map(char2num,'13579'))
13579将其整理成str2int的函数是:
fromfunctoolsimportreduce
DIGITS={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}defstr2int(s):
deffn(x,y):
returnx*10+ydefchar2num(s):
returnDIGITS[s]returnreduce(fn,map(char2num,s))lambda函数也可以进一步简化为:
fromfunctoolsimportreduce
DIGITS={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9.defchar2num(s):
returnDIGITS[s]defstr2int(s):
returnreduce(lambdax,y:x*10+y,map(char2num,s))也就是说,如果Python没有提供int()函数,你可以写一个函数,将字符串转换为整数,只需要几行代码。
