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
*
x
r
=
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所有数字转为字符串
l
=
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
x
+
y
s
=
reduce
(add, [
1
,
3
,
5
,
7
,
9
])
print
(s)
# 当然求和运算可以直接用Python内建函数sum(),没必要动用reduce
# 但是如果要把序列[1, 2, 5, 7, 9]变换成整数13579,reduce就可以派上用场
def
fn(x, y):
return
x
*
10
+
y
s
=
reduce
(fn, [
1
,
3
,
5
,
7
,
9
])
print
(s)
# 考虑到字符串str也是一个序列,配合map(),我们就可以写出把str转换为int的函数
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]
s
=
reduce
(fn,
map
(char2num,
'13579'
))
print
(s)
# 整理成一个str2int的函数
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))
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函数的用法这里不详细介绍
|
本文转自yeleven 51CTO博客,原文链接:http://blog.51cto.com/11317783/1953986