操作顺序如何在 Python 上进行?

新手上路,请多包涵

我的问题是这样的:

   10-7//2*3+1

我应该解方程。

使用 PEMDAS 时,我的答案似乎是 8:

 First its's 2*3 = 6; 10-7//6+1
second = 7//6= 1; 10-1+1
Third = 10-8 = 8;

但是当把它放到 python 中时,我得到一个 2。为什么会这样?

程序顺序似乎是这样的:

 first: 7//2=3; 10-3*3+1
second: 3*3=9; 10-9+1
third:10-9+1= 2; 2

我不明白。

原文由 Ashton 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 376
1 个回答

PEMDAS is P , E , MD , AS ;乘法和除法具有 _相同的优先级_,加法和减法也是如此。当除法运算符出现在乘法之前时,除法先进行。

Python 运算符的执行顺序由 运算符优先级 决定,并遵循相同的规则。优先级较高的运算符先于优先级较低的运算符执行,但当它们在同一组中时,运算符具有 匹配 的优先级。

对于 10-7//2*3+1 ,您有两类运算符,从最低到最高:

  • +, - (与 AS == _加法和减法_)
  • *, @, /, //, % (与 MD 相关,所以 _乘法和除法_)。

所以 //* 先执行;乘法和除法属于同一 _组_,这里不是固定顺序( MD 并不意味着乘法在除法之前):

 10 - ((7 // 2) * 3) + 1

所以 7 // 2 首先执行,然后乘以 3。然后你从 10 减去,最后加 1。


我们已经掩盖了一个不会影响您的特定情况但对于编写真正的 Python 程序非常重要的问题。 PEMDAS 与操作 顺序 无关;它不决定事物的评估顺序。它实际上是关于 参数分组 的。 PEMDAS says that a + b + c * d is evaluated as (a + b) + (c * d) , but it doesn’t say whether a + b or c * d is evaluated first.

在数学中,您首先评估什么并不重要,只要您尊重参数分组即可。在 Python 中,如果您评估了 b()c() 首先在 a() + (b() + c()) 中,因为它们在括号中的结果完全不同,所以 Python 可能会得到完全不同的结果有副作用。

Python 表达式求值主要从左到右进行。例如,在 a() + b() + (c() * d()) 中,评估顺序如下:

  • a()
  • b()
  • 第一个 + ,现在它的参数已经准备好了
  • c()
  • d()
  • * ,现在它的参数已经准备好了
  • 第二个 + ,现在它的参数已经准备好了

这是尽管 * 的高优先级和乘法周围的括号。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题