题目:python
利用map
和reduce
编写一个str2float
函数,把字符串'123.456'
转换成浮点数123.456
函数
答案:spa
from functools import reduce #把字符串数字 变成单独的数字个体 def chars2num(s): chars_num = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9} return chars_num[s] #把这些独立的数字,拼成相应的数字 # #计算小数点左边的数字 def point_left(x,y): return x*10 + y #计算小数点右边的数字 def point_right(x,y): return x*0.1 + y #把带小数点的字符串数字转化成小数 def str2float(s): chars = s #根据小数点,将字符串分割成左右两块 chars = chars.split(".") #将左右两块字符串,分别转化成独立的数字 # #左边 chars_num1 = map(chars2num,chars[0]) #右边 chars_num2 = map(chars2num,chars[1]) #计算左边数字 left_num = reduce(point_left,chars_num1) #计算右边数字 right_num = reduce(point_right,list(chars_num2)[::-1])*0.1 #最终数据 num = left_num + right_num #精简点的写法 #num = reduce(point_left,map(chars2num,chars[0])) + reduce(point_right,list(map(chars2num,chars[1]))[::-1])*0.1 print(num) #调用函数,查看结果 str2float("123.456")
这里面用到了字符串自带的split 方法,对字符串进行了切割。code
right_num 在计算时须要从后向前计算,因此采用列表的切片的操做[开始位置:结束位置:步幅],步幅为负,表示从右向左。字符串
right_num 之因此要再*0.1 是由于 reduce 函数是每次取两个参数,这里是先取6,5。计算完再取4,若是这时不*0.1,个数位是4,可是咱们须要是个数位是0 ,因此须要再*0.1it