1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# map/reduce
from  functools  import  reduce
# Python内建了map()和reduce()函数
 
# map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
 
 
def  f(x):
     return  *  x
 
=  map (f, [ 1 2 3 4 5 6 7 8 9 ])
print ( list (r))
print (r)
 
 
# map()传入的第一个参数是f,即函数对象本身
# 由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list
 
# map作为高阶函数,事实上它把运算规则抽象了,它可以计算任意复杂的函数
 
# 把List所有数字转为字符串
=  list ( map ( str , [ 1 2 3 4 5 6 7 8 9 ]))
print (l)
 
 
# reduce把一个函数作用在一个序列[x1, x2, x3, ...],这个函数必须接收两个参数
# reduce把结果继续和序列的下一个元素做累积计算
# 其效果就是  reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
 
# 使用reduce对一个序列求和
 
def  add(x, y):
     return  +  y
 
=  reduce (add, [ 1 3 5 7 9 ])
print (s)
 
# 当然求和运算可以直接用Python内建函数sum(),没必要动用reduce
# 但是如果要把序列[1, 2, 5, 7, 9]变换成整数13579,reduce就可以派上用场
 
 
def  fn(x, y):
     return  *  10  +  y
 
=  reduce (fn, [ 1 3 5 7 9 ])
print (s)
 
# 考虑到字符串str也是一个序列,配合map(),我们就可以写出把str转换为int的函数
 
 
def  fn(x, y):
     return  *  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,  '13579' ))
print (s)
 
# 整理成一个str2int的函数
 
 
def  str2int(s):
     def  fn(x, y):
         return  *  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))
 
=  str2int( '112233' )
print (s)
 
 
# 用lambada函数进一步简化
 
 
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))
 
print (str2int( '9999' ))
 
# lambda函数的用法这里不详细介绍