Python学习笔记5——Map_Reduce

#高级函数:可以把函数做为参数传入的函数
#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('测试失败!')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值