Python 如何更改数学顺序中的优先级(星号)
我希望用户在我的系统中输入数学公式。如何使用Python将case1公式转换为case2公式?换言之,我想专门更改双星号的数学顺序Python 如何更改数学顺序中的优先级(星号),python,python-2.7,numpy,math,Python,Python 2.7,Numpy,Math,我希望用户在我的系统中输入数学公式。如何使用Python将case1公式转换为case2公式?换言之,我想专门更改双星号的数学顺序 #case1 3*2**3**2*5 >>>7680 #case2 3*(2**3)**2*5 >>>960 下面是使用reas实现此目的的示例: expression = '3*2**3**2*5' asterisk_exprs = re.findall(r"\d+\*\*\d+", expression) # List o
#case1
3*2**3**2*5
>>>7680
#case2
3*(2**3)**2*5
>>>960
下面是使用
re
as实现此目的的示例:
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'
>>> eval(expression)
960
要计算str
表达式的数学值,请使用eval
作为:
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'
>>> eval(expression)
960
下面是使用
re
as实现此目的的示例:
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'
>>> eval(expression)
960
要计算str
表达式的数学值,请使用eval
作为:
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'
>>> eval(expression)
960
这不仅不是Python所支持的,而且实际上,您为什么要这样做呢?修改BIDMAS或PEMDAS(取决于您所在的位置),不仅会给您错误的答案,还会让所有查看代码的开发人员感到困惑
只需使用括号,如案例2中所示,这就是它们的用途。这不仅不是Python所支持的,而且实际上,您为什么要这样做?修改BIDMAS或PEMDAS(取决于您所在的位置),不仅会给您错误的答案,还会让所有查看代码的开发人员感到困惑
只需像案例2中那样使用括号,这就是它们的用途。如果用户应该在您的程序中输入公式,我建议保持原样。原因是数学中的幂运算是,这意味着执行从顶层向下。例如:
a**b**c=a**(b**c)
,按惯例
有一些程序使用自底向上的叠加求幂解析法——MS Excel和LibreOffice是其中的一些,但是,这违反了常规惯例,总是让我感到非常困惑
如果您希望覆盖此行为,并且在数学上仍然正确,则必须使用括号
您可以随时声明自己的power方法,以您想要的方式进行解析,比如numpy.pow()
。你可能会让内置软件过载,但那太仓促了
如果用户应该在您的程序中输入公式,我建议保持原样。原因是数学中的幂运算是,这意味着执行从顶层向下。例如:
a**b**c=a**(b**c)
,按惯例
有一些程序使用自底向上的叠加求幂解析法——MS Excel和LibreOffice是其中的一些,但是,这违反了常规惯例,总是让我感到非常困惑
如果您希望覆盖此行为,并且在数学上仍然正确,则必须使用括号
您可以随时声明自己的power方法,以您想要的方式进行解析,比如numpy.pow()
。你可能会让内置软件过载,但那太仓促了
你到底想做什么?你确实改变了数学顺序…你想让幂运算比乘法结合得更紧密?在将代码传递给求值函数之前,您必须编写经过并插入括号的代码。您到底想做什么?你确实改变了数学顺序…你想让幂运算比乘法结合得更紧密?在将其传递给求值函数之前,您必须编写经过并插入括号的代码。您的输出在语法上无效。编辑:已更新答案。您的输出在语法上无效。编辑:已更新答案。更正,OP不是更改不同的运算符优先级,而是更改堆叠的求幂顺序。如果示例是
2**3**2
与(2**3)**2
——在这两种情况下都是同一个运算符——请看,即使关联性几乎被设置为标准,x**y**z
应该始终是右关联的,因此它是x**(y**z)
。这对于正态分布是必需的,在正态分布中有一个类似于e**(-t**2)
的公式。更正,OP不是改变不同的运算符优先级,而是改变叠加的求幂顺序。如果示例是2**3**2
与(2**3)**2
——在这两种情况下都是同一个运算符——请看,即使关联性几乎被设置为标准,x**y**z
应该始终是右关联的,因此它是x**(y**z)
。这对于正态分布是必需的,在正态分布中有一个类似于e**(-t**2)
的公式。