从错误中学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 3442】 3442: 学习小组 (最大费用流)
3442: 学习小组 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 403 Solved: 193 Description [背景] 坑校准备鼓励学生 ...
- SpringBoot 搭建简单聊天室
SpringBoot 搭建简单聊天室(queue 点对点) 1.引用 SpringBoot 搭建 WebSocket 链接 https://www.cnblogs.com/yi1036943655/p ...
- 最新iOS砸壳方式Frida (Mac OSX)
1. 安装Frida 首先需要安装Python3,我下载的是 macOS 64-bit installer 安装,因Macbook本机自带python为2.7.x,故需要配置~/.bash_profi ...
- jquery-ajax请求:超时设置,增加 loading 提升体验
前端发送Ajax请求到服务器,服务器返回数据这一过程,因原因不同耗时长短也有差别,且这段时间内页面显示空白.如何优化这段时间内的交互体验,以及长时间内服务器仍未返回数据这一问题,是我们开发中不容忽视的 ...
- iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET
iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET Weex
- setTimeout你知多少
假期这么快就结束了,其实对我来说没什么影响,因为我一周才两节课,对于课多的同学来说,我天天在休假,不要羡慕哟~ 但休假并不代表闲着,还是得苦逼的编代码,唉..一入程序深似海.. 不管学得多少,还是总 ...
- pytest文档1-环境准备与入门
前言 首先说下为什么要学pytest,在此之前相信大家已经掌握了python里面的unittest单元测试框架,那再学一个框架肯定是需要学习时间成本的. 刚开始我的内心是拒绝的,我想我用unittes ...
- OpenShift 如何获取bearer Token以便进行各种API调用
Openshift 需要通过bearer token的方式和API进行调用,比如基于Postman就可以了解到,输入bearer token后 1.如何获取Bearer Token 但Bearer T ...
- 14.ThreadLocal
ThreadLocal 1.线程局部变量,是一种多线程并发访问变量的解决方案,与同步技术 synchronize 加锁的方式不同,threadlocal完全不提供锁,而使用 空间 ...
- Java多线程学习(吐血超具体总结)
林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文仅仅能说是java多线程的一个入门.事实上Java里头线程全然能够写一本书 ...