从错误中学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从右往左取,第二个參数表示右边開始取的位置,第一个參数表示第一个不用取的位置。

时间: 2024-11-06 21:18:33

从错误中学python(2)————字符串转浮点数的相关文章

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

题目 给你两个正整数a和b, 输出它们的最大公约数 辗转相除法 辗转相除法的步骤 def gcd(b,a): b,a=a,b%a if a==0: return b else: return gcd(b,a) 即就是取如果b与a不能整除,就取a和b除以a的余数再考察是个递归的思路. 理解 可以从两个角度去理解辗转相除法 1.举例法 一张长方形纸,长2703厘米,宽1113厘米.要把它截成若干个同样大小的正方形,纸张不能有剩余且正方形的边长要尽可能大.问:这样的正方形的边长是多少厘米? 解答: 可

从错误中学python(1) —— 规范化英文名字

题目 利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字.输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']: 题目来源--致敬廖学峰 定义函数法 错误的尝试 def normalize(name): name=name.lower() name[0]=name[0]+'A'-'a' return name 这里犯了一个错误,主要是c.c++的习惯思维,认为'A','a'这种写法就是单个字符了,但是我感

Python 把字符串变成浮点数

from functools import reducedi = {}di.update(zip('1234567890.', [1,2,3,4,5,6,7,8,9,0,'.'])) def str2float(s): st = s.split('.') st1 = reduce(lambda x,y: 10*x + y, map(lambda x: di[x], st[0])) try: st2 = reduce(lambda x,y: (x*0.1 + y), map(lambda x: d

Python判断字符串是否为字母或者数字(浮点数)

str为字符串s为字符串 str.isalnum() 所有字符都是数字或者字母 str.isalpha() 所有字符都是字母 str.isdigit() 所有字符都是数字 str.isspace() 所有字符都是空白字符.\t.\n.\r 检查字符串是数字/浮点数方法 float部分 >> float('Nan') nan >> float('Nan') nan >> float('nan') nan >> float('INF') inf >>

python中字符串链接的七种方式

一. str1+str2 string类型 '+'号连接 >>> str1="one" >>> str2="two" >>> str1+str2 'onetwo' >>>注意:该方式性能较差,因为python中字符串是不可变的类型,使用 + 连接两个字符串时会生成一个新的字符串,生成新的字符串就需要重新申请内存,当连续相加的字符串很多时(a+b+c+d+e+f+...) ,效率低下就是必然的了例

Python格式化字符串

在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作符,非常类似C语言里的printf()函数的字符串格式化(C语言中也是使用%). 下面整理了一下Python中字符串格式化符合: 格式化符号 说明 %c 转换成字符(ASCII 码值,或者长度为一的字符串) %r 优先用repr()函数进行字符串转换 %s 优先用str()函数进行字符串转换 %d / %i 转成有符号十进制数 %u

Python格式化字符串~转

Python格式化字符串 在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作符,非常类似C语言里的printf()函数的字符串格式化(C语言中也是使用%). 下面整理了一下Python中字符串格式化符合: 格式化符号 说明 %c 转换成字符(ASCII 码值,或者长度为一的字符串) %r 优先用repr()函数进行字符串转换 %s 优先用str()函数进行字符串转换 %d / %i

python 之字符串和编码

字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节.比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295. 由于计算机是美国人发明的,因此,最早只有1

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

Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This PEP proposes a new system for built-in string formatting operations, intended as a replacement for the existing '%' string formatting operator. 1.百分号