Python 内建 map()和 reduce()函数
map()函数接收两个参数一个是函数一个是一个 Iterable(迭代器), 并把结果作为新的 Iterator(生成器)返回
有一个函数 f(x)=x*x 作用于序列 list[1,2,3,4,5,6,7,8,9]
使用 python 函数实现
- >>> r=map(f,range(1,4))
- >>> r
- <map object at 0x7fcec039ee80>
- >>> list(r)
- [1, 4, 9]
- >>> def f(x):
- ... return x*x
- ...
- >>> r=map(f,[1,2,3,4,5,6,7,8,9])
- >>> r
- <map object at 0x7fcec039eda0>
- >>> list(r)
- [1, 4, 9, 16, 25, 36, 49, 64, 81]
map 传递的第一个参数是 f 是一个函数本身, 第二个参数为一个迭代器, 结果为生成器 Iterator 所以需要使用 list 函数打印才能打印
也可以不使用 map 函数而使用一个循环实现如下
- >>> L=[]
- >>> for i in range(1,11):
- ... L.append(i*i)
- ...
- >>> print(L)
- [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
map()作为高阶函数, 事实上它把运算规则抽象了, 因此, 我们不但可以计算简单的 f(x)=x2, 还可以计算任意复杂的函数, 比如, 把这个 list 所有数字转为字符串:
- >>> list(map(str,[1,2,3,4,5,6,7,8,9]))
- ['1', '2', '3', '4', '5', '6', '7', '8', '9']
同理以上可以使用循环实现
- >>> L=[1,2,3,4,5,6,7,8,9]
- >>> L
- [1, 2, 3, 4, 5, 6, 7, 8, 9]
- >>> L1=[]
- >>> for i in L:
- ... L1.append(str(i))
- ...
- >>> print(L1)
- ['1', '2', '3', '4', '5', '6', '7', '8', '9']
使用 map 可以一行代码实现
reduce 的用法
reduce 把一个函数作用在一个序列 [x1, x2, x3, ...] 上, 这个函数必须接收两个参数, reduce 把结果继续和序列的下一个元素做累积计算, 其效果就是:
reduce(f,[x1,x2,x3.x4])=f(f(f(x1,x2),x3),x4)
比如一个序列求和
- >>> from functools import reduce
- >>> def add(x,y):
- ... return x+y
- ...
- >>> reduce(add,[1,3,5,7,9])
- 25
- # 执行顺序如下
- add(add(add(add(1,3),5),7),9)
- add(add(add(4,5),7),9)
- add(add(9,7),9)
- add(16,9)
- 25
求和运算可以使用 python 内建函数 sum 实现
- >>> sum([1,3,5,7,9])
- 25
但是如果需要把序列 [1,3,5,7,9] 变成整数就可以使用 reduce
- >>> from functools import reduce
- >>> def fn(x,y):
- ... return x*10+y
- ...
- >>> reduce(fn,[1,3,5,7,9])
- 13579
这个例子本身没多大用处, 但是, 如果考虑到字符串 str 也是一个序列, 对上面的例子稍加改动, 配合 map(), 我们就可以写出把 str 转换为 int 的函数:
PS:python 内置函数 int 可以把 str 转换成 int
- >>> int('13579')
- 13579
假设 python 不带 int 函数怎么把 str '13579'转换成整数 13579
思路
char2num.py
- # 加载 reduce 模块
- from functools import reduce
- def fn(x,y):
- return x*10+y
- # 定义函数把字符串转换成数字参数为字符串'1', 返回为整数 1
- def char2num(s):
- digits={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
- return digits[s]
- s='13579'
- print('需要转换成整数的字符串是',s)
- # 使用 map 函数生成迭代器, 迭代后输出为[1,3,5,7,9]
- l=map(char2num,s)
- print('使用 map 转换后的生成器',l)
- # 使用 reduce 把生成的序列计算成整数
- # 计算过程为
- #reduce(fn,[1,3,5,7,9])
- #fn(fn(fn(fn(1,3),5),7),9)
- #fn(fn(fn(13,5),7),9)
- #fn(fn(135,7),9)
- #fn(1357,9)
- #13579
- print(reduce(fn,l))
运行输出如下
需要转换成整数的字符串是 13579
使用 map 转换后的生成器 <map object at 0x7f5cbec4e7b8>
13579
改成函数 char2num_fuction.py
- # 加载 reduce 模块
- from functools import reduce
- def char2int(s):
- def fn(x,y):
- return x*10+y
- # 定义函数把字符串转换成数字参数为字符串'1', 返回为整数 1
- def char2num(s):
- digits={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
- return digits[s]
- return(reduce(fn,map(char2num,s)))
- s='13579'
- print(char2int(s))
练习 1 利用 map 函数把用户不规范输入的字符串改成规范及首字母大写其余小写
normalize.py
- def normalize(name):
- return name.title()
- L1=['adam','LISA','barT']
- L2=list(map(normalize,L1))
- print(L2)
输出
['Adam', 'Lisa', 'Bart']
练习 2 请编写一个 prod()函数, 可以接受一个 list 并利用 reduce()求积:
prod.py
- from functools import reduce
- def fn(x,y):
- return x*y
- def prod(L):
- return reduce(fn,L)
- PROD=prod([3,5,7,9])
- print(PROD)
来源: http://www.bubuko.com/infodetail-3096349.html