我正在尝试用 Python 编写一个程序,使物理计算变得更容易。我添加了一些物理常量作为变量,并尝试通过 input() 输入公式并使用 eval() 进行计算来使用它们进行运算。问题是,它需要一个星号,我想找到一个解决方法。目前它只适用于这样的事情:p=m*v,不适用于p=mv,而据我所知,后者更常用于教科书等。
尝试输入公式“ue”,预期结果为2.6604783878223602e-46
u=1.66054*10**(-27)
pi=3.141592653589793238462643383279502884197169
c2=299792458**2
formula=input("Input formula: ")
answer=eval(formula)
print(answer)
并出现错误:
answer=eval(formula)
File "<string>", line 1, in <module>
NameError: name 'ue' is not defined
首先,在没有确保命令安全的情况下不要使用 eval,因为
eval("exit()")
只需退出程序,就像
exec
功能一样工作。
但是如下所示的计划应该可以使您的目标成为可能:
from math import *
class Function():
def recSpecialFuncs(func,string):
match string:
case "sin":
return "sin"
case "cos":
return "cos"
case _:
return "?"
def Parse(func,string):
chrSeq = "";digest = ""
for c,l in enumerate(list(string)):
if l in func.vars:
chrSeq += l
n = "*" if len(chrSeq) >1 else ""
val = func.recSpecialFuncs(chrSeq)
if val=="?":
digest+=n+l
elif len(chrSeq) > 1:
digest = digest[:(len(digest)+2-2*len(chrSeq)+1)]
digest += "$@"+val+"$"
else:
chrSeq = ""
if l in func.b:
digest+=l
elif l in func.operators:
if l == "^":
digest+="**"
else:
digest+=l
elif l.isnumeric() or l == ".":
digest+=l
func.digest= digest
func.split = func.digest.split("$")
def run(func,vals):
st = ""
for val in func.split:
cp = val
if len(val)>0 and val[0]!="@":
for g in vals:
cp=cp.replace(g[0],str(g[1]))
st+=cp
return eval(st.replace("@",""))
def __init__(func,string):
super().__init__()
func.b = list("()")
func.operators=list("+-^*/")
func.vars = list("abcdefghijklmnopqrstuvwxyz")
func.Parse(string)
举这个例子:
sine = Function("sin(x)")
print(sine.run([("x",0)]))
输出:
0.0
如果您想要一些特定的常量,您可以将它们添加到
recSpecialFuncs
开关,例如:
case "pi":
return "pi"
要使用超过 1 个变量,请传递更多:
func = Function("mv^2/2")
print(func.run([("m",1),("v",2)]))