如何在Python中不使用星号的情况下将数学公式中的两个元素相乘?

问题描述 投票:0回答:1

我正在尝试用 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
python python-3.x
1个回答
0
投票

首先,在没有确保命令安全的情况下不要使用 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)]))
© www.soinside.com 2019 - 2024. All rights reserved.