2016-09-29 93 views
0

我希望用户在我的系统中输入数学公式。如何使用Python将case1公式转换为case2公式?换句话说,我想改变双数星号的数学顺序。如何更改数学顺序的优先级(星号)

#case1 
3*2**3**2*5 
>>>7680 

#case2 
3*(2**3)**2*5 
>>>960 
+0

你究竟想要做什么?你确实改变了数学顺序... – MooingRawr

+0

你想指数运算比乘法更紧密吗?您必须编写经过的代码并在将其传递给评估函数之前插入括号。 –

回答

0

下面是实现这一点使用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 
+0

您的输出在语法上无效。编辑:was –

+0

更新了答案。 –

1

不仅是这不是Python支持的东西,但真的,你为什么想要?修改BIDMAS或PEMDAS(取决于你的位置),不仅会给你不正确的答案,还会让任何看着代码的开发者感到困惑。

只需使用方括号2中的括号,就是它们的用途。

+1

更正,OP不会改变不同的运算符优先级,而是改变堆栈的取幂顺序。如果例子是'2 ** 3 ** 2'与'(2 ** 3)** 2' - 在两种情况下它们是相同的运算符,则会更清楚 - 请参阅https:// en .wikipedia.org/wiki/Order_of_operations#Special_cases – RafazZ

+0

即使关联性设置得非常标准,“x ** y ** z”应该总是正确的关联,因此它是“x **(y ** z)”。对于像'e **(-t ** 2)'这样的公式的普通分布来说,这是需要的。 –

1

如果用户应该在程序中输入公式,我会建议保持原样。原因在于数学中的求幂是right-associative,这意味着执行从顶层向下。例如:a**b**c = a**(b**c),按惯例。

有一些程序使用自下而上的堆栈求幂运算--MS Excel和LibreOffice是其中的一些,但是,它违背了常规惯例,并且总是把我搞糊涂了。

如果你想覆盖这种行为,仍然是数学上正确的,你必须使用括号。

你总是可以声明自己的能量方法,它可以解决你想要的方式 - 像numpy.pow()。你可能会超载内置的,但这太嘈杂了。

Read this