我的问题是这样的:
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 许可协议
PEMDAS
isP
,E
,MD
,AS
;乘法和除法具有 _相同的优先级_,加法和减法也是如此。当除法运算符出现在乘法之前时,除法先进行。Python 运算符的执行顺序由 运算符优先级 决定,并遵循相同的规则。优先级较高的运算符先于优先级较低的运算符执行,但当它们在同一组中时,运算符具有 匹配 的优先级。
对于
10-7//2*3+1
,您有两类运算符,从最低到最高:+, -
(与AS
== _加法和减法_)*, @, /, //, %
(与MD
相关,所以 _乘法和除法_)。所以
//
和*
先执行;乘法和除法属于同一 _组_,这里不是固定顺序(MD
并不意味着乘法在除法之前):所以
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 whethera + b
orc * d
is evaluated first.在数学中,您首先评估什么并不重要,只要您尊重参数分组即可。在 Python 中,如果您评估了
b()
和c()
首先在a() + (b() + c())
中,因为它们在括号中的结果完全不同,所以 Python 可能会得到完全不同的结果有副作用。Python 表达式求值主要从左到右进行。例如,在
a() + b() + (c() * d())
中,评估顺序如下:a()
b()
+
,现在它的参数已经准备好了c()
d()
*
,现在它的参数已经准备好了+
,现在它的参数已经准备好了这是尽管
*
的高优先级和乘法周围的括号。