利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456:
分析:
首先把输入字符串分成整数部分和小数部分处理,可以使用字符串的split方法实现。
整数部分从高位(整个浮点数的最高位)开始借助乘法(x10)和加法处理
小数部分从低位(整个浮点数的最低位)开始借助除法(/10)和加法处理
1.整数部分
整数部分可以参考老师讲的str2int例子,很清晰(我懒。。) eg: '123.456' -> '123', '456'
(为了自己消化理解,还是写下。。嗯真香。。)
1) 定义一个字典,可以把数字字符(str)映射成数字(int)
2) map函数中使用一个匿名函数将整数部分字符串变成数字,得到一个惰性序列
3) reduce函数中也使用一个匿名函数,将由map得到的序列从左到右对应高位到低位转换为整数部分数字
eg:map得到的序列 1,2,3 | reduce得到的整数部分 (1x10+2)x10+3 = 123
2.小数部分
1) 同理,使用字典把数字字符(str)映射成数字(int)
2) map函数中使用一个匿名函数将小数部分字符串变成数字,得到一个惰性序列
我们想从最后一个数字开始处理(即从低位到高位)
所以想把这个序列反序,由于map函数得到的是惰性序列,所以要先用list()处理一下 eg:4,5,6(惰性序列) -> [6,5,4]
3) reduce函数中也使用一个匿名函数,将由map得到的序列从左到右对应低位到高位转换为小数部分数字
eg:(6/10+5)/10+4=4.56 需要再除以10和整数部分相加返回
代码实现:
# -*- coding: utf-8 -*-
from functools import reduce
def str2float(s):
split_s = s.split('.')
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
p1 = reduce(lambda x,y:10*x+y,map(lambda z:DIGITS[z],split_s[0]))
p2 = reduce(lambda x,y:x/10+y,list(map(lambda z:DIGITS[z],split_s[1]))[::-1])
return p1+p2/10
关于split方法(参考菜鸟教程,http://www.runoob.com/python/att-string-split.html)
split() 方法语法:
str.split(str="", num=string.count(str)).
参数:
str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num -- 分割次数
返回值:
返回分割后的字符串列表。