高阶函数map/reduce课后习题之字符串转为浮点数

致敬廖雪峰老师!!!

题目要求:利用mapreduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456

我的思路:

(1)找出小数点位置

(2)小数点前直接int,后面int后做运算,xxx/10^n,n为后面数字个数

(3)然后前后相加

这是我最先想到的思路

代码如下

def Str2Float(s):
    #Find Positon of '.'
    Num = s.index('.')
    #取小数点前面
    FrontStr = s[:Num]
    #取小数点后面
    BehindStr = s[Num - len(s) + 1:]
    #做运算
    FrontNum = int(FrontStr)
    BehindNum = int(BehindStr) / 10**len(BehindStr)
    Number = FrontNum + BehindNum
    return Number
print(Str2Float('123.456'))
View Code

但是题目要求利用map和reduce吖,所以还是以上思路,改装如下:

from functools import reduce

#excise1:利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,
#其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']:
def Normalize(name):
    return name.title()

# 测试:
L1 = ['adam', 'LISA', 'barT']
L2 = list(map(Normalize, L1))
print(L2)

#excise2:Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积:

def prod(L):
    def Product(x,y):return x * y
    return reduce(Product,L)

#测试
print('3 * 5 * 7 * 9 =', prod([3, 5, 7, 9]))
if prod([3, 5, 7, 9]) == 945:
    print('测试成功!')
else:
    print('测试失败!')

#excise3:利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456
#我的思路:
# 1.找小数点的位置,然后把前后两部分数字各截取出来
# 2.前面直接int,后面做运算:xxx/10^n,n代表后面数字个数
# 3.前后相加,打印
#思路缺点:没有使用到map和reduce函数,代码量大,
# def Str2Float(s):
#     #Find Positon of .
#     Num = s.index('.')
#     FrontStr = s[:Num]
#     BehindStr = s[Num - len(s) + 1:]
#     FrontNum = int(FrontStr)
#     BehindNum = int(BehindStr) / 10**len(BehindStr)
#     Number = FrontNum + BehindNum
#     return Number
# print(Str2Float('123.456'))

# 使用map和reduce的思路
# 与上面思路相仿
# 找出点的位置前后截取
# str --> int
# 做运算


Digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def Str2Float(s):
    #找 . 的位置并前后截取
    PointPosition = s.index('.')
    FrontStr = s[:PointPosition]
    BehindStr = s[PointPosition - len(s) + 1:]   
    Front = Str2Int(FrontStr)
    Behind = Str2Int(BehindStr) / 10**len(BehindStr)
    return Front + Behind

#定义转换为整数的函数
def Str2Int(s):
    def fn(x, y):
        return x * 10 + y
    def Char2Num(s):
        return Digits[s]
    return reduce(fn, map(Char2Num, s))


#测试
print('Str2Float(\'1433223.456\') =', Str2Float('1433223.456'))
if abs(Str2Float('123.456') - 123.456) < 0.00001:
    print('测试成功!')
else:
    print('测试失败!')
View Code

前面excise1和2是前面两练习的解答,我再看看别的大佬的代码理解下,再跟上

转载于:https://www.cnblogs.com/zhangzemin/p/10946093.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值