每次运行代码并使用 % 时,我要么得到一个位数的错误答案,要么代码停止。如果我尝试使用单位数字答案执行“退出”,则打印功能正在工作,但带有回溯,因为它是以 xquit 的形式执行的,而不是仅仅退出。
import re
print("Cal_C")
print("Type 'quit' to exit the Cal_C\\n")
previous = 0
run = True
def calculate():
global run
global previous
if previous == 0:
value = input("Enter the value:")
else:
value = input(str(previous))
if value == 'quit':
print("Shutting down...now.")
run = False
else:
value = re.sub("[a-zA-Z,.:()]", '', value)
if previous == 0:
previous = eval(value)
else:
previous = eval(str(previous) + value)
while run:
calculate()
这里有几个问题。如果计算结果为 0,则您的代码认为您正在重新开始。我建议使用另一个值。
该函数应返回一个布尔值,告诉调用者是否继续。我在这里已经做到了。
import re
print("Cal_C")
print("Type 'quit' to exit the Cal_C\\n")
previous = ''
def calculate():
global previous
if previous == '':
value = input("Enter the value:")
else:
value = input(str(previous))
if value == 'quit':
print("Shutting down...now.")
return False
value = re.sub("[a-zA-Z,.:()]", '', value)
previous = eval(str(previous) + value)
return True
while calculate():
pass
更好的设计是
calculate
接受当前累加器作为参数,并返回更新后的值。这样,就不需要全局变量了。 calculate
是一个很好的独立函数,没有副作用,甚至可以在其他情况下重用。
import re
print("Cal_C")
print("Type 'quit' to exit the Cal_C\\n")
def calculate(accum):
if accum == '':
value = input("Enter the value:")
else:
value = input(str(accum))
if value == 'quit':
print("Shutting down...now.")
return None
value = re.sub("[a-zA-Z,.:()]", '', value)
return eval(str(accum) + value)
accum = ''
while accum is not None:
accum = calculate(accum)
你在这里欺骗了自己:
if value == 'quit':
print("Shutting down...now.")
run = False
因为应用程序没有关闭现在,所以它首先继续执行该功能。最终导致这里:
previous = eval(str(previous) + value)
这将产生您所看到的错误,因为
previous
的值为 2
并且 value
的值为 "quit"
,因此您尝试评估代码 2quit
,从而产生错误。
要关闭应用程序,首先应退出该功能:
if value == 'quit':
print("Shutting down...now.")
run = False
return