如何让用户重用python计算器中先前计算的结果

时间:2014-02-28 17:48:53

标签: python python-3.x input calculator

我在python上相当新,所以我对它不太了解。我做了一个计算器,我希望它接受一个:

ans()

输入。目前,如果存在[0-9 * / - +]以外的某些内容,则有一个部分阻止程序执行输入,因此它不会崩溃。我怎么做

ans()

表示最后输入的等式的输出,因此我可以输入如下内容:

>> 8*8 #last input
64 #last output
>> ans()*2 #current input
128 # current output

希望我正确地解释了一切,这是我的代码:

valid_chars = "0123456789-+/* \n";
while True:
x = "x="
y = input(" >> ")
x += y
if any(c not in valid_chars for c in y):
    print("WARNING: Invalid Equation")
    continue
try:
    exec(x)
except (SyntaxError, ZeroDivisionError):
    print ("WARNING: Invalid Equation")
else:
    print(x)

更新:我在答案中添加了几行,但它不会运行(我也修复了缩进):

valid_chars = "0123456789-+/* \n";
while True:
    x = "x="
    y = input(" >> ")
    x += y
    def ans():
        return _
    def ans():
        try:
            return _
    except NameError:
        return 0 # appropriate value
    if any(c not in valid_chars for c in y):
        print("WARNING: Invalid Equation")
        continue
    try:
        exec(x)
    except (SyntaxError, ZeroDivisionError):
        print ("WARNING: Invalid Equation")
    else:
        print(x)

错误:NameError

以外的“意外缩进”

我做错了什么,如何解决这个问题?感谢

3 个答案:

答案 0 :(得分:4)

如果你想在python解释器中使用你的程序,你可以使用一个简单的技巧。解释器将最后一个输出存储在特殊变量_中:

>>> def ans():
...     return _
... 
>>> 8 * 8
64
>>> ans() * 8
512
>>> def ans():
...     return _
... 
>>> 8 * 8
64
>>> ans() * 2
128
>>> 

请记住,如果到目前为止还没有任何输出,_可以提升NameError。你可以用这样的东西来处理它:

>>> def ans():
...     try:
...         return _
...     except NameError:
...         return 0 # appropriate value
... 

答案 1 :(得分:1)

在Python REPL循环中_代表最后一个结果;但是,计算器可能不是这种情况。

尝试类似

的内容
valid_chars = "0123456789-+/*()ans \n";
result = None

...

result = eval(x.replace('ans()',str(result))

你可能想要比valid_chars更好的东西,并解析正确的表达式。另外,你要评价的是表达式而不是方程式。

希望这有帮助。

答案 2 :(得分:1)

此:

valid_chars = "0123456789-+/* \n"
while True:
    x = "x="
    y = input(" >> ")
    x += y
    def ans():
        return z
    def ans():
        try:
            return z
    except NameError:
        return 0 # appropriate value
    if any(c not in valid_chars for c in y):
        print("WARNING: Invalid Equation")
        continue
    try:
        exec(x)
    except (SyntaxError, ZeroDivisionError):
        print ("WARNING: Invalid Equation")
    else:
        z = x
        print(x)