从错误中学python(2)————字符串转浮点数
题目
自己编写函数:利用map和reduce编写一个str2float函数,把字符串’123.456’转换成浮点数123.456:
题目来源——致敬廖雪峰
解决过程
初步的解决方法
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]
#这事实上是一个字典
index_point=s.find('.')
if index_point==-1:
daichu=1
else:
daichu=0.1**(len(s)-1-index_point)
s=s[0:index_point]+s[index_point+1:]#这里是除去小数点
from functools import reduce
result1=reduce(lambda x,y:x*10+y,map(char2num,s))
return result1*daichu
这里用到字符串的find()函数进行模式匹配。
这个看起来是没有问题的可是python3.0里面0.1的三次方是:
>>> 0.1**3
0.0010000000000000002
所以这样不行,那么我们就是用除法
改用除法
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]
#这事实上是一个字典
index_point=s.find('.')
if index_point==-1:
daichu=1
else:
daichu=10**(len(s)-1-index_point)
s=s[0:index_point]+s[index_point+1:]#这里是除去小数点
from functools import reduce
result1=reduce(lambda x,y:x*10+y,map(char2num,s))
return result1/daichu
这样就能得到正确的结果了。
可是这里我们使用find()函数还要用切片生成新的字符串,这里能够用split()函数
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]
#这事实上是一个字典
strs,index_point=s.split('.'),len(s.split('.')[1])
daichu=10**index_point
s=strs[0]+strs[1]#这里是除去小数点
from functools import reduce
result1=reduce(lambda x,y:x*10+y,map(char2num,s))
return result1/daichu
这里的char2num事实上是全然不必要定义的,由于已经有int(str)这样的构造函数了
改用int函数
def str2float(s):
strs,index_point=s.split('.'),len(s.split('.')[1])
daichu=10**index_point
s=strs[0]+strs[1]#这里是除去小数点
from functools import reduce
result1=reduce(lambda x,y:x*10+y,map(int,s))
return result1/daichu
当然我们也能够把小数部分倒着计算,这样代码会更简短。花更短的时间思考就能写更短的代码
小数部分倒着算
from functools import reduce
def str2float(s):
a = s.split('.')
return reduce(lambda x, y: x*10+y, map(int, a[0]))\
+ reduce(lambda x, y: x/10+y, map(int, a[1][::-1])) / 10
a[1][::-1])这种方法非常巧妙。能够用于把字符串倒序输出。比如
a[::-1]
也就是设置步长为1从右往左取,第二个參数表示右边開始取的位置,第一个參数表示第一个不用取的位置。
从错误中学python(2)————字符串转浮点数的更多相关文章
- 从错误中学python(4)——最小公约数与辗转相除法
题目 给你两个正整数a和b, 输出它们的最大公约数 辗转相除法 辗转相除法的步骤 def gcd(b,a): b,a=a,b%a if a==0: return b else: return gcd( ...
- Python 把字符串变成浮点数
from functools import reducedi = {}di.update(zip('1234567890.', [1,2,3,4,5,6,7,8,9,0,'.'])) def str2 ...
- Python:字符串
一.序列的概念 序列是容器类型,顾名思义,可以想象,“成员”们站成了有序的队列,我们从0开始进行对每个成员进行标记,0,1,2,3,...,这样,便可以通过下标访问序列的一个或几个成员,就像C语言中的 ...
- Python的字符串和编码
1. 字符编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit) ...
- Python格式化字符串~转
Python格式化字符串 在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作 ...
- Python格式化字符串和转义字符
地址:http://blog.chinaunix.net/uid-20794157-id-3038417.html Python格式化字符串的替代符以及含义 符 号 说 明 ...
- Python基础-字符串格式化_百分号方式_format方式
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- python判断字符串
python判断字符串 s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小 ...
- Python格式化字符串
在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作符,非常类似C语言里的pr ...
随机推荐
- 【BZOJ 4180】 4180: 字符串计数 (SAM+二分+矩阵乘法)
4180: 字符串计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 164 Solved: 75 Description SD有一名神犇叫做Oxe ...
- 【UOJ 79】 一般图最大匹配 (✿带花树开花)
从前一个和谐的班级,所有人都是搞OI的.有 n 个是男生,有 0 个是女生.男生编号分别为 1,…,n. 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个人负责吐槽.每个人至多属于 ...
- [CF126D]Fibonacci Sums/[BJOI2012]最多的方案
[CF126D]Fibonacci Sums/[BJOI2012]最多的方案 题目大意: 将\(n(n\le10^9)\)表示成若干个不同斐波那契数之和的形式,求方案数. 思路: 如果不考虑\(0\) ...
- [CodeForces850C]Arpa and a game with Mojtaba
题目大意: 给你一个包含n个数的数列,两个人轮流对数列进行如下操作: 选择一个质数p和一个正整数k,将数列中所有能被p^k整除的数除以p^k. 最后不能操作者负. 问先手是否有必胜策略. 思路: 显然 ...
- WNDR4300v2 固件编译
WNDR4300v2 固件编译 1.从官网下载源码 从官网找到 https://kb.netgear.com/2649/NETGEAR-Open-Source-Code-for-Programme ...
- mysql root密码忘了怎么办?
服务器多起来,密码也就多了,多到自己记不住了,也忘记存哪里了.昨天刚刚下载了KeePass来管理密码,不过为时已晚,我已经忘记了mysql的root密码.好惨好惨,难道还要重装么.还好,有一种方法可以 ...
- HTML5 本地存储(Web Storage)
HTML5 提供了两种在客户端存储数据的新方法: localStorage - 本地永久存储,下次打开浏览器数据依然存在 sessionStorage - 只存在于一个会话的数据存储,关闭浏览器数据会 ...
- WM-G-MR-09模块
WM-G-MR-09模块,该模块同时支持SDIO与SPI 模式 USI(环隆电气)WM-G-MR-09,该WiFi芯片支持802.11b/g无线网络模式,芯片体积8.2×8.4×1.35(mm),采用 ...
- Executing a system tool
Executing a system tool The following code example shows the execution of the Buffer tool from the A ...
- 前端必备工具-IETest
浏览器兼容性可以检查IE5.5到10 ,一直还用IE6来测试,因为觉得这样错误显示更真实,但是现在不换也不行,很多网页都已经不支持ie6了,实在受不了,果断升级,而且这个也是升级了才能用的,既然很多前 ...