Python的幂运算符与右边关联的理由是什么?


9

我正在编写代码以解析数学表达式字符串,并注意到在Python中对链式幂运算符进行求值的顺序与Excel中的顺序不同。

http://docs.python.org/reference/expressions.html

“因此,在无括号的幂和一元运算符序列中,运算符是从右到左求值的(这不限制操作数的求值顺序):-1 * 2得出-1。” *

这意味着,在Python中: 2**2**3被评估为2**(2**3) = 2**8 = 256

在Excel中,它的工作方式与之相反:2^2^3被评估为(2^2)^3 = 4^3 = 64

我现在必须为自己的解析器选择一个实现。Excel顺序更容易实现,因为它反映了乘法的求值顺序。

我问办公室周围的一些人,他们对评估的直觉是什么2^2^3,得到的回应不一。

有人知道有任何有利于Python实现的理由或考虑吗?如果您没有答案,请评论从直觉中获得的结果- 64256


实施起来并不难。无论如何,对于诸如分配之类的事情,您的解析器将必须以某种方式支持正确的关联性。
marco-fiset 2012年

是的,不是,我实际上实现了它。但是我恢复到Excel约定,因为我的库的主要用途之一是将方程式导出到Excel,因此坚持方程式在其中的工作方式更加有意义。
PieterMüller2012年

Answers:


10

自上而下应用数学中的堆叠指数的原因是,您获得指数乘积的另一种方式是:

(((2^3)^4)^5) = 2^(3 * 4 * 5)

目前尚不清楚您的答案。...但这不是指数在这种情况下的工作原理吗?(((2 ^ 3)^ 4)= 8 ^ 4 =(2 ^ 3)*(2 ^ 3)*(2 ^ 3)*(2 ^ 3)= 2 ^(3 + 3 + 3 + 3)= 2 ^ 12
Pureferret 2012年

3
是的。我的观点是,在可以选择的两个顺序中,一个产生的结果可以在不堆叠指数的情况下编写。因此,有趣的关联性是另一个。
安德烈

14

维基百科(和我的数学老师)告诉我:从上到下应用堆叠的指数。

这反映了Python对其进行评估的方式。微软错了(更多)

而且Ruby将其评估为Python,因此毫无疑问是正确的,因为Matz不会错。


4
另请参阅有关有趣的D语言实现操作符(支持正确的关联性)的有趣文章
Pedro Romano 2012年

我记得Visual Basic以相同的方式对其进行评估,但是我不确定这是否会增加此方法的可信度。;)
Xion 2012年

仅当Microsoft不遵守它声称要遵循的某些规范时,它才是“错误的”。不同的语言对数学运算的评价不同。如果我没记错的话,APL使所有操作都正确关联。与不同规范的不一致是令人讨厌的,但不一定是“错误的”。
基思·汤普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.