栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python温度转换器的优化:

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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('程序拒绝被调戏并跑路了')

不知道除了for循环,大佬们还有什么更好的实现方式呢?

如果各位大佬发现有什么问题或者还能优化的地方,欢迎指出!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/445363.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号