MAP/REDUCE


map():

map()函数接收两个参数,一个是函数,一个是Iterable。map将传入的函数一次作用到序列的每个元素。并把结果作为Iterator返回。

举例,有一个计算机平方的函数。f(x) =x * x

>>>def f(x):

    return x *x

>>>r =map(f,[1,2,3,4,5])

>>>list(r)

[1,4,9,16,25]

map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,是惰性序列,所以通过list()将整个序列都计算出来,并返回一个list。

上述结果同样可以使用循环做到:
>>>L =[]

>>>for i in [1,2,3,4,5]:

    L.append(f(i))

   print(L)

事实上,map()作为高阶函数它把运算规则抽象化了,因此我们不仅可以计算f(x) = x*x ,而且还可以计算人以复杂的函数,比如把这个list所有数字转化为字符串:
>>>list(map(str,[1,2,3,4,5,6,7,8]))

['1','2','3','4','5','6','7','8']


reduce:

reduce是把一个函数作用在一个序列[x1,x2,x3,...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,效果:

reduce(f,[x1,x2,x3,x4]) =f(f(f(x1,x2),x3),x4)

如果将序列[1,2,3,4,5]变成12345,则使用reduce实现将是非常简单:
>>>from functools import reduce

>>>def fn(x,y):
    return x*10 +y 

>>>reduce(fn,[1,2,3,4,5])

12345

这个例子本身没有多大用处,但是如果考虑到字符串也是一个序列,对上面的例子稍加改动。配合map(),我们就可以写出将str转换为int的函数:
>>>from functools import reduce

>>>def fn(x,y):
    return x*10 +y

>>>def char2num(s):

       return{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]

>>>reduce(fn,map(char2num,'12345'))

12345

整理成一个str2int的函数就是:
>>>from functools import reduce

  def str2int(s):
      def fn(x,y):

          return x*10 +y

      def char2num(s):
          return{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]

      return reduce(fn,map(char2num,s))

还可以使用lambda进一步简化:
>>>from functools import reduce

>>>def char2num(s):
      return{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]

>>>def str2int(s):
     return reduce(lambda x,y:x*10+y,map(char2num,s))

也就是说Python没有提供int()函数,你完全可以自己写一个把字符串转换为整数的函数。而且只需要几行代码。