【发布时间】:2014-03-01 07:28:00
【问题描述】:
我还在学习 python,所以请善待 :) 我想让用户做这样的事情:
>> sqrt(4) #input
2 #output
和
>> sqrt(8) #input
2*rad(2) #if this is not possible, just say something like "not valid"
和
>> 4*4 #1st input
16 #1st output
>> sqrt(ans()) #2nd input
4 #2nd output
我的代码:
from math import sqrt
valid_chars = "0123456789-+/*ansqrt() \n"
while True:
x = "x="
y = input(" >> ")
x += y
def ans():
try:
return z
except NameError:
return 0
if(y == "end" or y == "End" or y == "exit" or y == "Exit" or y == "cancel" or y == "Cancel"):
break
if any(c not in valid_chars for c in y):
print("WARNING: Invalid Equation")
continue
try:
exec(x)
except (SyntaxError, ZeroDivisionError, NameError, TypeError, ValueError):
print ("WARNING: Invalid Equation")
if not(y == "()"):
z = x
print(x)
else:
print("WARNING: Invalid Equation")
如果用户输入如下内容:
>> sqrt()x
WARNING: Invalid Equation
我知道我必须将 valid_chars 更改为:
valid_chars = "0123456789-+/*ansqrt() \n"
什么的。但是,对于其余的,我几乎不知道。先谢谢大家了,如果有什么问题或者觉得这里不完整,欢迎评论! :) 另外,不要回答:D
更新:
一些想法:
取“()”内部或外部的值。然后使该值等于例如“s”。之后:
d = sqrt((int(s)))
print (d)
但是,我需要一些东西来排除导致错误的输入,这样程序就不会崩溃。
另外,我不会公开此信息,因此您可以忽略将 python 语句作为输入是一个坏主意的事实。但是,我对如何做与 eval() 相同的事情的其他方式感兴趣。谢谢
更新代码:
问题已解决:
from math import sort
valid_chars = "0123456789-+/*ansqrt() \n";
while True:
x = "x="
y = input(" >> ")
x += y
def ans():
try:
return z
except NameError:
return 0
if(y == "end" or y == "End" or y == "exit" or y == "Exit" or y == "cancel" or y == "Cancel"):
break
if any(c not in valid_chars for c in y):
print("WARNING: Invalid Equation")
continue
try:
exec(x)
except (SyntaxError, ZeroDivisionError, NameError, TypeError, ValueError):
print ("WARNING: Invalid Equation")
else:
if not(y == "()"):
z = x
print(x)
else:
print("WARNING: Invalid Equation")
【问题讨论】:
-
问题是您将用户输入作为 Python 执行——但
sqrt()4不是有效的 Python。你必须做点别的事情。 -
如果您的输入语法遵循 Python 的规则,您当前的代码将可以工作:
sqrt(4)或sqrt(ans()) -
为什么要将括号放在之前 4而不是它周围?
-
你应该使用
valid_chars = ['0', '1','2',..,'ans()', 'sqrt()']等 -
@user2357112 因为我不知道如何解决 () 内部的问题。
标签: python math input sqrt square-root