题目:
利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456:
我的代码:
from functools import reduce
def str2float(s):
def transform(s): # 将字符形式的数字转换成int型,并把'.'转换成1数字10
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '.': 10}[s]
number = list(map(transform, s)) #利用map函数将字符串形式的float拆分成数字
n = 0
for i in number: # 找出小数点在list中的位置
if i == 10:
break
n = n + 1
numberleft = number[: n] #根据小数点位置将浮点数分为两部分:整数部分和小数部分
numberright = number[n + 1 :]
def leftassemble(x, y): #定义函数,将整数部分数字组合
return 10 * x + y
floatleft = reduce(leftassemble, numberleft) #调用reduce函数,得到整数部分组合的结果
n = 0.1 # 得出小数部分的组合结果
floatright = 0
for i in numberright:
floatright = floatright + i * n
n = n * 0.1
return floatleft + floatright #整数部分和小数部分加起来得到最终结果
# 测试
print('str2float(\'123.456\') =', str2float('123.456'))
我的思路
- 利用map()转换字符串为数字
- 定位小数点的位置
- 将整数部分和小数部分分开计算
- 将两者计算结果相加,完成
网友的代码:
from functools import reduce
def str2float(s):
def char2num(s):
return {'0':0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def fn(x,y):
return x * 10 + y
L = list(s)
for i in range(len(L)):
if L[-i] == '.':
L.pop(-i)
num1 = reduce(fn,map(char2num,L))
num2 = num1/10**(i-1)
print(num2)
# 测试
str2float('123.45')
分析:
思路:
- 将字符串转换成list
- 将list中的'.'去掉
- 用reduce()和map()得到一个整数
- 定位字符串中小数点位置,将整数转换为浮点数。
比较:
- 网友的代码量少,更易读。
- 网友的思路更容易实现,简单清晰。
改良:
我通过对str的函数进行了解,以及网络的搜索,利用str的replace()将'.'去掉,利用str的find()定位'.'
from functools import reduce
def str2float(s):
def char2num(s):
return {'0':0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def fn(x, y):
return x * 10 + y
num = reduce(fn, map(char2num, s.replace('.', ''))) / 10 ** (len(s) - s.find('.')-1)
print(num)
# 测试
str2float('123.45')