#高级函数:可以把函数做为参数传入的函数
#map(function,Iterable):map函数接收两个参数,第一个是函数,第二个是可迭代对象,map将传入的函数依次作用到Iterable中的每个元素,并把结果做为新的Iterator返回,举例如下:
def PingFang(x):
return x*x
m = map(PingFang,range(1,10))
print(list(m)) #因map生成的m为惰性序列(Iterator),所以需要通过list()函数将其转为Iterable
strs = list(map(str,range(1,10))) #通过map函数将数字序列转换为字符列表
print(strs)
abslist = list(map(abs,range(-5,5))) #通过map函数将数字序列全部转为正数
print(abslist)
#reduce(fucntion,Iterable):Reduce函数接收两个参数,第一个是函数,第二个是可迭代对象,Reduce接受的函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
#对一个序列求和,也可直接用sum()函数实现
from functools import reduce #导入Reduce
def add(a,b):
return a+b
sum= reduce(add,range(1,5));
print(sum)
#把一个序列变成整数(如将[1,2,3,4,5]转换为12345)
def mul10(x,y):
return x*10+y
num = reduce(mul10,range(1,5))
print(num)
#将一个字符串转换为整数
def strtoint(string):
digits={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
return digits[string]
num = reduce(mul10,map(strtoint,'54321'))
print(num)
#用拉姆达表达式简化如下
digits={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
def char2num(s):
return digits[s]
def str2int(s):
return reduce(lambda x,y:x*10+y,map(char2num,s))
print(str2int('678910'))
#将不规范的英文名变为驼峰命名的规范名字
def normalize1(name):
temp = [x.lower() for x in list(name)]
if len(temp)>0:
temp[0] = temp[0].upper()
return reduce(lambda x,y:x+y,temp)
else:
return ''
def normalize2(name):
if len(name)==0:
return ''
else:
return name[:1].upper()+name[1:].lower()
unnormalizenames = ['','lucy','LILY','jacK']
print(list(map(normalize1,unnormalizenames)))
print(list(map(normalize2,unnormalizenames)))
#使用reduce求一个列表的积
def prod(L):
return reduce(lambda x,y:x*y,L)
print(prod(range(1,5)))
#使用map和reduce把字符串转换成浮点数,关于浮点数是有一个大坑的,下面的检测之所以用减法然后小于0.0001的方法,而不是直接用等于,是因为python是以双精度(64)位来保存浮点数的,多余的位会被截掉,所以0.1保存的时候已不是精确的0.1,参与运算以后就会出现问题
def str2float(s):
l = s.split('.')
num = reduce(lambda x,y:x*10+y,map(char2num,l[0]+l[1]))
if s.__contains__('.'):
num *= 0.1**len(l[1])
return num
else:
return num
print('str2float(\'123.456\') =', str2float('123.456'))
if abs(str2float('123.456') - 123.456) < 0.00001:
print('测试成功!')
else:
print('测试失败!')
Python学习笔记5——Map_Reduce
最新推荐文章于 2021-07-14 17:34:19 发布