上课时老师给了一段写好的温度转换器,是这样的:
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