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

6yt4nkrj  于 7个月前  发布在  PyCharm
关注(0)|答案(2)|浏览(70)

**已关闭。**此问题需要debugging details。目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答问题。
9天前关闭
Improve this question
每次我运行我的代码并使用%时,我要么得到一个个位数的错误答案,要么代码就停止了。如果我尝试执行“quit”并得到一个个位数的答案,那么打印功能可以工作,但带有回溯,因为它是以xquit的形式执行的,而不是quit。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()

字符串

3okqufwl

3okqufwl1#

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

inkz8wg9

inkz8wg92#

你在这里欺骗了自己:

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

相关问题