我在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
以外的“意外缩进”我做错了什么,如何解决这个问题?感谢
答案 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)