有人可以帮我弄清楚为什么我会得到我编写的基本计算器代码(python)的回溯吗?

问题描述 投票:0回答:2

每次运行代码并使用 % 时,我要么得到一个位数的错误答案,要么代码停止。如果我尝试使用单位数字答案执行“退出”,则打印功能正在工作,但带有回溯,因为它是以 xquit 的形式执行的,而不是仅仅退出。See the image for a better understanding

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()
python python-3.x pycharm calculator
2个回答
1
投票

这里有几个问题。如果计算结果为 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)

0
投票

你在这里欺骗了自己:

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
© www.soinside.com 2019 - 2024. All rights reserved.