Python学习十三 ~ map/reduce

Python内建了map()reduce()函数。是高阶函数,把运算规则抽象。

Map

map()函数接收两个参数,一个是函数,只接受一个参数,一个是Iterable(可迭代对象)map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator(迭代器)返回。

1
2
3
4
5
6
7
8
9
10

def (x):
return x * x

# r是一个Iterator,Iterator是惰性序列,可以通过list()函数让它把整个序列都计算出来并返回一个list。
m = map(f, [1,2,3,4,5])
print(list(m))

m = map(str, [1,2,3,4,5])
print(list(m))

Reduce

reduce函数接收两个参数,一个是函数,必须接受两个参数,一个是Iterable(可迭代对象),把函数作用在一个序列每个元素上,reduce把结果继续和序列的下一个元素做累积计算

1
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
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
# reduce
from functools import reduce

def add(x, y):
return x + y

r = reduce(add, [1,2,3,4,5,])
print(r)


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

r = reduce(fn, [1,2,3,4,5])
print(r)

DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def strInt(s):
def fn(x, y):
return x * 10 + y
def charNum(s):
return DIGITS[s]
return reduce(fn, map(charNum, s))

print(strInt('123456'))

# lambda函数简化
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def charNum(s):
return DIGITS[s]

def strInt(s):
return reduce(lambda x, y: x * 10 + y, map(charNum, s))

print(strInt('1234567'))
1
2
3
4
5
6
7
8
9
10
11
12
13
# 练习题
names = ['adam', 'LISA', 'barT']

def normalize_custom(name):
return name[:1].upper() + name[1:].lower()

print(list(map(normalize_custom, names)))


def prod(l):
return reduce(lambda x, y: x * y, l)

print(prod([3,5,7,9]))