(二更)Python温度转换器的优化:

上课时老师给了一段写好的温度转换器,是这样的:

TempStr=input('请输入带符号的温度值:')

if TempStr[-1] in ['F','f']:
    C=(eval(TempStr[0:-1])-32)/1.8
    print('转换后的温度值为{:.2f}C'.format(C))
elif TempStr[-1] in ['c','C']:
    F=eval(TempStr[0:-1])*1.8+32
    print('转换后的温度值为{:.2f}F'.format(F))
else:
    print('输入格式错误')

但是我发现了一个bug:如果我什么都不输入呢?这不,一不小心就报错了。

 于是我稍稍优化了那么一下代码:

TempStr=input('请输入带符号的温度值:')

if TempStr in [''] or TempStr[-1] not in ['f','F','C','c'] :
    print('未输入数据或输入格式错误,请勿调戏程序')
    TempStr=input('请认真输入带符号的温度值:')
if TempStr[-1] in ['F','f']:
    C=(eval(TempStr[0:-1])-32)/1.8
    print('转换后的温度值为{:.2f}C'.format(C))
elif TempStr[-1] in ['c','C']:
    F=eval(TempStr[0:-1])*1.8+32
    print('转换后的温度值为{:.2f}F'.format(F))

但是问题又来了:如果我连续两次/多次不输入呢?报错它悄无声息地回来了:

 那我。。。放个for循环?

TempStr=input('请输入带符号的温度值:')

for i in range(2):
    if TempStr in [''] or TempStr[-1] not in ['f','F','C','c'] :
        print('未输入数据或输入格式错误,请勿调戏程序')
        TempStr=input('请认真输入带符号的温度值:')
if TempStr[-1] in ['F','f']:
    C=(eval(TempStr[0:-1])-32)/1.8
    print('转换后的温度值为{:.2f}C'.format(C))
elif TempStr[-1] in ['c','C']:
    F=eval(TempStr[0:-1])*1.8+32
    print('转换后的温度值为{:.2f}F'.format(F))
else:
    print('程序拒绝被调戏并跑路了')

从理论上说,只要设定的for循环次数足够多,问题就解决了。但是这样处理时间复杂度有点高欸。那我......加个break?

TempStr=input('请输入带符号的温度值:')

for i in range(1000):
    if TempStr in [''] or TempStr[-1] not in ['f','F','C','c'] :
        print('未输入数据或输入格式错误,请勿调戏程序')
        TempStr=input('请认真输入带符号的温度值:')
    elif TempStr[-1] in ['F','f']:
        C=(eval(TempStr[0:-1])-32)/1.8
        print('转换后的温度值为{:.2f}C'.format(C))
        break
    elif TempStr[-1] in ['c','C']:
        F=eval(TempStr[0:-1])*1.8+32
        print('转换后的温度值为{:.2f}F'.format(F))
        break
    else:
        print('程序拒绝被调戏并跑路了')

那如果我算完一次还想让它继续算呢?

for i in range(1000):
    TempStr=input('请输入带符号的温度值:')
    for i in range(1000):
        if TempStr in [''] or TempStr[-1] not in ['f','F','C','c'] :
            print('未输入数据或输入格式错误,请勿调戏程序')
            TempStr=input('请认真输入带符号的温度值:')
        else:
            break
    if TempStr[-1] in ['F','f']:
        C=(eval(TempStr[0:-1])-32)/1.8
        print('转换后的温度值为{:.2f}C'.format(C))
        TempStr=''
    elif TempStr[-1] in ['c','C']:
        F=eval(TempStr[0:-1])*1.8+32
        print('转换后的温度值为{:.2f}F'.format(F))
        TempStr=''
    else:
        print('程序拒绝被调戏并跑路了')

在我眼里似乎是没有什么问题了,时间复杂度好像也没问题?再加一个如何退出的提示,完美!

for i in range(1000):
    TempStr=input('请输入带符号的温度值,输入quit则退出程序:')
    if TempStr=='quit':
        break
    for i in range(1000):
        if TempStr in [''] or TempStr[-1] not in ['f','F','C','c'] :
            print('未输入数据或输入格式错误,请勿调戏程序')
            TempStr=input('请认真输入带符号的温度值,输入quit则退出程序:')
        else:
            break
    if TempStr[-1] in ['F','f']:
        C=(eval(TempStr[0:-1])-32)/1.8
        print('转换后的温度值为{:.2f}C'.format(C))
        TempStr=''
    elif TempStr[-1] in ['c','C']:
        F=eval(TempStr[0:-1])*1.8+32
        print('转换后的温度值为{:.2f}F'.format(F))
        TempStr=''
    else:
        print('程序拒绝被调戏并跑路了')

最后意识到一个小问题,前面不多次计算的版本这样写似乎更好:

TempStr=input('请输入带符号的温度值:')
 
for i in range(1000):
    if TempStr in [''] or TempStr[-1] not in ['f','F','C','c'] :
        print('未输入数据或输入格式错误,请勿调戏程序')
        TempStr=input('请认真输入带符号的温度值:')
    else:
        break
if TempStr[-1] in ['F','f']:
    C=(eval(TempStr[0:-1])-32)/1.8
    print('转换后的温度值为{:.2f}C'.format(C))
elif TempStr[-1] in ['c','C']:
    F=eval(TempStr[0:-1])*1.8+32
    print('转换后的温度值为{:.2f}F'.format(F))
else:
    print('程序拒绝被调戏并跑路了')

二更:

今天在无意间又发现了一个bug

你永远无法想象用户在使用时会有什么样奇奇怪怪的输入绕过了你的判断,比如这个:

输入ff

ff确实符合之前的判断规则,不为空也以f结尾,但因为前面不是数字,自然没办法进行后面的转换

所以理论上只要检测f,F,c,C前面是否为数字就可以了

这里就有了一个新的知识点:判断数字

可以使用str.isdigit(),判断字符串是否只由数字组成

于是我的代码最终版本变成了这样:

for i in range(1000):
    TempStr=input('请输入带符号的温度值,输入quit则退出程序:')
    num=TempStr[0:-1] 
    #为了方便后续使用isdigit,将除去最后一个字符的输入内容赋值给变量num    
    if TempStr=='quit':
        break
    for i in range(1000):
        if TempStr in [''] or TempStr[-1] not in ['f','F','C','c'] or not num.isdigit() :
            print('未输入数据或输入格式错误,请勿调戏程序')
            TempStr=input('请认真输入带符号的温度值,输入quit则退出程序:')
            num=TempStr[0:-1]
        else:
            break
    if TempStr[-1] in ['F','f']:
        C=(eval(num)-32)/1.8
        print('转换后的温度值为{:.2f}C'.format(C))
        TempStr=''
    elif TempStr[-1] in ['c','C']:
        F=eval(num)*1.8+32
        print('转换后的温度值为{:.2f}F'.format(F))
        TempStr=''
    else:
        print('程序拒绝被调戏并跑路了')

 完美!不过没有最完美,只有更完美,欢迎大佬们继续开脑洞找bug

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值