python高阶函数map_Python之高阶函数map/reduce

本文详细介绍了Python中map和reduce函数的应用,包括如何通过map函数处理列表数据,并使用reduce进行累积计算,还提供了将字符串转换为数值的具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]

>>> def f(x):

... return x*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=[]

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

思路

1144139-20190618170016939-1794286780.png

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

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)

练习3 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456:

str2float.py

from functools import reduce

def str2float(s):

def fn(x,y):

return x*10+y

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]

s1,s2=s.split('.') #字符串'123.456'使用.号分割后的列表为['123','456']分别赋值给s1 s2

s1=reduce(fn,list(map(char2num,s1))) #由字符串'123'转换成整数123

s2=reduce(fn,list(map(char2num,s2))) #由字符串'456'转换成整数456

while s2>=1: #如果s2>=1

s2=s2/10 #则除以10取商一直到s2<1 最后s2=0.456浮点数

return s1+s2 #整数加小数作为函数结果返回

s=str2float('123.456')

print(s)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值