题目

自己编写函数:利用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)————字符串转浮点数的更多相关文章

  1. 从错误中学python(4)——最小公约数与辗转相除法

    题目 给你两个正整数a和b, 输出它们的最大公约数 辗转相除法 辗转相除法的步骤 def gcd(b,a): b,a=a,b%a if a==0: return b else: return gcd( ...

  2. Python 把字符串变成浮点数

    from functools import reducedi = {}di.update(zip('1234567890.', [1,2,3,4,5,6,7,8,9,0,'.'])) def str2 ...

  3. Python:字符串

    一.序列的概念 序列是容器类型,顾名思义,可以想象,“成员”们站成了有序的队列,我们从0开始进行对每个成员进行标记,0,1,2,3,...,这样,便可以通过下标访问序列的一个或几个成员,就像C语言中的 ...

  4. Python的字符串和编码

    1. 字符编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit) ...

  5. Python格式化字符串~转

    Python格式化字符串 在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作 ...

  6. Python格式化字符串和转义字符

    地址:http://blog.chinaunix.net/uid-20794157-id-3038417.html Python格式化字符串的替代符以及含义     符   号     说     明 ...

  7. Python基础-字符串格式化_百分号方式_format方式

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  8. python判断字符串

    python判断字符串 s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小 ...

  9. Python格式化字符串

    在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作符,非常类似C语言里的pr ...

随机推荐

  1. [NOI2014]购票 --- 斜率优化 + 树形DP + 数据结构

    [NOI2014]购票 题目描述 今年夏天,NOI在SZ市迎来了她30周岁的生日. 来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每 ...

  2. VIM选项配置说明

    选项配置说明 选项书写格式 选项说明 :se[t] 显示所有被改动的选项 :se[t] all 显示所有非 termcap 选项 :se[t] termcap 显示所有 termcap 选项 :se[ ...

  3. JSP -- include指令与include动作的区别

    JSP -- include指令与include动作的区别 (1)格式的区别: include指令:<%@include file = "文件名"%> include动 ...

  4. hust 1590 - 方块游戏 数学

    1590 - 方块游戏 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/problem/show/1590 D ...

  5. Sencha Touch开发环境搭建及ext插件Spket安装

    第一步:JAVA SDK(JDK)的安装 以去问百度下载JDK,也可以到官方下载JDK. 下载地址: http://www.oracle.com/technetwork/java/javase/dow ...

  6. Python类中self的作用

    摘自论坛: self:是指向你新创建对象实例的引用,在这个地方指向你创建的Person类的实例p.当你调用Person类创建实例时,self指的就是你这个P,所以这个地方p=Person('tiany ...

  7. nodejs中间件拦截,express不登录无法进入后台页面

    22.设置拦截 只有登录才能进入到后台页面,不登录无法进入 如果登陆成功, 写入session, 参数 uid uid=123dsfjksldfjsl 检测登陆, 请求中 session 是否包含 u ...

  8. CentOS 6.9设置阿里云源/163源

    阿里云: 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS ...

  9. InvalidateRect()与Invalidate()的用法(转)

    BOOL InvalidateRect(   HWND hWnd,           // 窗口句柄   CONST RECT* lpRect,   // 矩形区域   BOOL bErase    ...

  10. PHP大转盘中奖概率算法实例

    本文实例讲述了PHP大转盘中奖概率算法的实现方法,分享给大家供大家参考.具体如下: 大转盘是最近很多线上网动中一个比较有意思的东西了,下面我们就来看看这个大转盘中奖概率算法与例子,希望对各位有所帮助. ...