[python练习] 利用map和reduce编写str2float函数

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

分析:

首先把输入字符串分成整数部分和小数部分处理,可以使用字符串的split方法实现。

整数部分从高位(整个浮点数的最高位)开始借助乘法(x10)和加法处理

小数部分从低位(整个浮点数的最低位)开始借助除法(/10)和加法处理

1.整数部分

整数部分可以参考老师讲的str2int例子,很清晰(我懒。。) eg: '123.456' -> '123', '456'

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317852443934a86aa5bb5ea47fbbd5f35282b331335000

(为了自己消化理解,还是写下。。嗯真香。。)

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 -- 分割次数

返回值:

返回分割后的字符串列表。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值