我的问题是这样的:
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
我不明白。
PEMDAS
是P
、E
、MD
、AS
;乘法和除法具有相同的优先级,加法和减法也是如此。当除法运算符出现在乘法之前时,先除法。
Python 运算符的执行顺序由 运算符优先级 控制,并遵循相同的规则。优先级较高的运算符先于优先级较低的运算符执行,但当它们位于同一组中时,运算符具有匹配优先级。
对于
10-7//2*3+1
,您有 2 类运算符,从最低到最高:
+, -
(与 AS
== 加法和减法相关)*, @, /, //, %
(与 MD
相关,因此乘法和除法)。所以先执行
//
和*
;乘法和除法属于同一个组,这里没有固定的顺序(MD
并不意味着乘法在除法之前):
10 - ((7 // 2) * 3) + 1
所以先执行
7 // 2
,然后乘以 3。然后从 10 中减去,最后加 1。
我们忽略了一个问题,该问题不会影响您的特定情况,但对于编写真正的 Python 程序非常重要。 PEMDAS 并不是真正关于操作的“顺序”;而是关于操作的“顺序”。它并不决定事物的评估顺序。这实际上是关于参数分组。 PEMDAS 说 a + b + c * d
被评估为
(a + b) + (c * d)
,但没有说明首先评估 a + b
还是 c * d
。在数学中,只要尊重参数分组,首先评估什么并不重要。在 Python 中,如果您首先在
b()
中计算
c()
和 a() + (b() + c())
,只是因为它们位于括号中,您可能会得到完全不同的结果,因为 Python 函数可能有副作用。Python 表达式求值大多是从左到右进行的。例如,在
a() + b() + (c() * d())
中,评估顺序如下:
a()
b()
+
c()
d()
*
+
*
的优先级很高并且乘法周围有括号。
我不知道
PE(MD)(AS)
是什么,但 Python 的操作顺序(优先顺序)规则按照官方文档中的“运算符优先级”表所述进行。 :)
请记住,许多这些运算符优先级规则在 Python 中与在 C或 在 C++ 中是相反,但是这里是 Python 3 中的“运算符优先级”规则:
要阅读表中的所有脚注,请单击上面的链接。