Python内建了map()和reduce()函数。app
若是你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念。函数
咱们先看map。map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次做用到序列的每一个元素,并把结果做为新的list返回。spa
举例说明,好比咱们有一个函数f(x)=x2,要把这个函数做用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就能够用map()实现以下:.net
如今,咱们用Python代码实现:code
1
2
3
4
5
|
>>>
def
f(x):
...
return
x
*
x
...
>>>
map
(f, [
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
])
[
1
,
4
,
9
,
16
,
25
,
36
,
49
,
64
,
81
]
|
map()传入的第一个参数是f,即函数对象自己。htm
你可能会想,不须要map()函数,写一个循环,也能够计算出结果:对象
1
2
3
4
|
L
=
[]
for
n
in
[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
]:
L.append(f(n))
print
L
|
的确能够,可是,从上面的循环代码,能一眼看明白“把f(x)做用在list的每个元素并把结果生成一个新的list”吗?ci
因此,map()做为高阶函数,事实上它把运算规则抽象了,所以,咱们不但能够计算简单的f(x)=x2,还能够计算任意复杂的函数,好比,把这个list全部数字转为字符串:字符串
1
2
|
>>>
map
(
str
, [
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
])
[
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
]
|
只须要一行代码。get
再看reduce的用法。reduce把一个函数做用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素作累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比方说对一个序列求和,就能够用reduce实现:
1
2
3
4
5
|
>>>
def
add(x, y):
...
return
x
+
y
...
>>>
reduce
(add, [
1
,
3
,
5
,
7
,
9
])
25
|
固然求和运算能够直接用Python内建函数sum(),不必动用reduce。
可是若是要把序列[1, 3, 5, 7, 9]变换成整数13579,reduce就能够派上用场:
1
2
3
4
5
|
>>>
def
fn(x, y):
...
return
x
*
10
+
y
...
>>>
reduce
(fn, [
1
,
3
,
5
,
7
,
9
])
13579
|
这个例子自己没多大用处,可是,若是考虑到字符串str也是一个序列,对上面的例子稍加改动,配合map(),咱们就能够写出把str转换为int的函数:
1
2
3
4
5
6
7
8
|
>>>
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,
'13579'
))
13579
|
整理成一个str2int的函数就是:
1
2
3
4
5
6
|
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函数进一步简化成:
1
2
|
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]
|
1
2
|
def
str2int(s):
return
reduce
(
lambda
x,y: x
*
10
+
y,
map
(char2num, s))
|
也就是说,假设Python没有提供int()函数,你彻底能够本身写一个把字符串转化为整数的函数,并且只须要几行代码!
练习
利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其余小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']。
Python提供的sum()函数能够接受一个list并求和,请编写一个prod()函数,能够接受一个list并利用reduce()求积。