【问题标题】:Why is exponentiation applied right to left?为什么取幂从右到左?
【发布时间】:2018-05-05 21:15:24
【问题描述】:

我正在阅读 Python 简介教科书并遇到了这一行:

同一行上的运算符具有相同的优先级,并且从左到右应用,但取幂除外,它从右到左应用。

我了解其中的大部分内容,但我不明白为什么他们说取幂是从右到左应用的。他们也没有提供任何示例。另外,我可以问这样的一般性问题,还是只喜欢解决问题的问题?

【问题讨论】:

  • 这个措辞有点令人困惑。它谈论的是绑定行为,这意味着在更大的表达式中,确定** 绑定到的值是由优先顺序决定的。所以在a + b ** c ** d中,先执行什么是由优先顺序决定的。
  • 并且顺序遵循数学惯例,就像在加法之前应用乘法一样。
  • 在示例 a + b ** c * d 中,我猜它会是 (c * d) ** (a + b),对吗?因为根据优先顺序乘法在加法之前应用。
  • ** 绑定比乘法或加法更紧密。所以它是c * (d ** a) + b

标签: python python-3.x operators exponentiation


【解决方案1】:

** 运算符跟在normal mathematical conventions 后面;它是右结合的:

在通常的计算机科学术语中,数学中的取幂是右结合的,这意味着 xyz 应该读作 x(yz),而不是 (xy)z。在对 BODMAS 规则的阐述中,对这个问题的处理非常谨慎,规则是首先评估最高指数。

来自Wikipedia on the Order of Operations

如果用堆叠符号表示求幂,通常的规则是从上到下工作,因为求幂在数学中是右结合的。

所以2 ** 3 ** 4 计算为2 ** (3 ** 4) (== 2417851639229258349412352) 而不是(2 ** 3) ** 4 (== 4096)。

这在编程语言中非常普遍;它被称为右关联性,尽管个例外,其中 Excel 和 MATLAB 是最值得注意的。

【讨论】:

  • 非常感谢!这很有意义! :)
  • 嗨,Martijn。我还有一个问题。您能否向我解释一下为什么您首先选择表达式 a + b ** c * d 作为示例?我问的唯一原因是因为它在表达式中只有一个指数。谢谢~
  • @elitecheese1337:这是一个愚蠢的例子,没有说明问题。对不起。 :-/
  • @elitecheese1337:应该是a + b ** c ** d,真的。
【解决方案2】:

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

同一框中的运算符从左到右分组(比较除外,包括测试,它们都具有相同的优先级和从左到右的链 - 请参阅比较部分 - 和取幂,从右到左分组)。

>>> 2 ** 2 ** 2
16
>>> 2 ** 2 ** 2 ** 2
65536
>>> (2 ** 2 ** 2) ** 2
256

对于中间情况2 ** 2 ** 2 ** 2,这是中间步骤 -

  1. 分解为2 ** (2 ** (2 ** 2))
  2. 2 ** (2 ** (4)) # progressing right to left
  3. 2 ** (16) # this is 2 to the power 16 最终评估为65536 希望对您有所帮助!

【讨论】:

  • 我只是想列出一个从预期行为到意外行为的示例,然后解释发生了什么......但你说的有道理
【解决方案3】:

这个解释对我来说似乎很清楚。让我向您展示一个可能会启发这一点的示例:

print 2 ** 2 ** 3 # prints 256

如果你从左到右读这个,你会先读2 ** 2,结果是4,然后是4 ** 3,结果是64。 看来我们有一个错误的答案。 :)

但是,从右到左... 你会先做2 ** 3,这将是8,然后,2 ** 8,给我们256!

我希望我能够为您启发这一点。 :)

编辑:Martijn Pieters 更准确地回答了您的问题,抱歉。我忘了说这是数学惯例。

【讨论】:

  • 非常感谢!这对我来说很有意义!最初我的想法是当他们说从右到左时,他们的意思是 3 ** 2 ** 2。再次感谢!
猜你喜欢
  • 2021-09-24
  • 2014-06-26
  • 2016-09-16
  • 2015-07-04
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多