上课时老师给了一段写好的温度转换器,是这样的:
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循环,大佬们还有什么更好的实现方式呢?
如果各位大佬发现有什么问题或者还能优化的地方,欢迎指出!



