我希望用户在我的系统中输入数学公式。如何使用Python将case1公式转换为case2公式?换句话说,我想改变双数星号的数学顺序。如何更改数学顺序的优先级(星号)
#case1
3*2**3**2*5
>>>7680
#case2
3*(2**3)**2*5
>>>960
我希望用户在我的系统中输入数学公式。如何使用Python将case1公式转换为case2公式?换句话说,我想改变双数星号的数学顺序。如何更改数学顺序的优先级(星号)
#case1
3*2**3**2*5
>>>7680
#case2
3*(2**3)**2*5
>>>960
下面是实现这一点使用re
为例:
expression = '3*2**3**2*5'
asterisk_exprs = re.findall(r"\d+\*\*\d+", expression) # List of all expressions matching the criterion
for expr in asterisk_exprs:
expression = expression.replace(expr, "({})".format(expr)) # Replace the expression with required expression
# Value of variable 'expression': '3*(2**3)**2*5'
为了评价str
表达的数学值,使用eval
为:
>>> eval(expression)
960
您的输出在语法上无效。编辑:was –
更新了答案。 –
不仅是这不是Python支持的东西,但真的,你为什么想要?修改BIDMAS或PEMDAS(取决于你的位置),不仅会给你不正确的答案,还会让任何看着代码的开发者感到困惑。
只需使用方括号2中的括号,就是它们的用途。
更正,OP不会改变不同的运算符优先级,而是改变堆栈的取幂顺序。如果例子是'2 ** 3 ** 2'与'(2 ** 3)** 2' - 在两种情况下它们是相同的运算符,则会更清楚 - 请参阅https:// en .wikipedia.org/wiki/Order_of_operations#Special_cases – RafazZ
即使关联性设置得非常标准,“x ** y ** z”应该总是正确的关联,因此它是“x **(y ** z)”。对于像'e **(-t ** 2)'这样的公式的普通分布来说,这是需要的。 –
如果用户应该在程序中输入公式,我会建议保持原样。原因在于数学中的求幂是right-associative,这意味着执行从顶层向下。例如:a**b**c = a**(b**c)
,按惯例。
有一些程序使用自下而上的堆栈求幂运算--MS Excel和LibreOffice是其中的一些,但是,它违背了常规惯例,并且总是把我搞糊涂了。
如果你想覆盖这种行为,仍然是数学上正确的,你必须使用括号。
你总是可以声明自己的能量方法,它可以解决你想要的方式 - 像numpy.pow()
。你可能会超载内置的,但这太嘈杂了。
你究竟想要做什么?你确实改变了数学顺序... – MooingRawr
你想指数运算比乘法更紧密吗?您必须编写经过的代码并在将其传递给评估函数之前插入括号。 –