python高阶函数、map reduce 自己如何去定义_Python 之高阶函数 map/reduce

Python 之高阶函数 map/reduce

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

>>>list(r)

[1,4,9]

>>>deff(x):

...returnx*x

...

>>>r=map(f,[1,2,3,4,5,6,7,8,9])

>>>r

>>>list(r)

[1,4,9,16,25,36,49,64,81]

map 传递的第一个参数是 f 是一个函数本身, 第二个参数为一个迭代器, 结果为生成器 Iterator 所以需要使用 list 函数打印才能打印

也可以不使用 map 函数而使用一个循环实现如下>>>L=[]

>>>foriinrange(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=[]

>>>foriinL:

...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)

比如一个序列求和>>>fromfunctoolsimportreduce

>>>defadd(x,y):

...returnx+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>>>fromfunctoolsimportreduce

>>>deffn(x,y):

...returnx*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

思路

ab7653affab982b574eb7acc55df2e04.gif

char2num.py# 加载 reduce 模块

fromfunctoolsimportreduce

deffn(x,y):

returnx*10+y

# 定义函数把字符串转换成数字参数为字符串'1', 返回为整数 1

defchar2num(s):

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

returndigits[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 转换后的生成器

13579

改成函数 char2num_fuction.py# 加载 reduce 模块

fromfunctoolsimportreduce

defchar2int(s):

deffn(x,y):

returnx*10+y

# 定义函数把字符串转换成数字参数为字符串'1', 返回为整数 1

defchar2num(s):

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

returndigits[s]

return(reduce(fn,map(char2num,s)))

s='13579'

print(char2int(s))

练习 1 利用 map 函数把用户不规范输入的字符串改成规范及首字母大写其余小写

normalize.pydefnormalize(name):

returnname.title()

L1=['adam','LISA','barT']

L2=list(map(normalize,L1))

print(L2)

输出

['Adam', 'Lisa', 'Bart']

练习 2 请编写一个 prod()函数, 可以接受一个 list 并利用 reduce()求积:

prod.pyfromfunctoolsimportreduce

deffn(x,y):

returnx*y

defprod(L):

returnreduce(fn,L)

PROD=prod([3,5,7,9])

print(PROD)

来源: http://www.bubuko.com/infodetail-3096349.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值