我的问题看起来像这样:
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
我还是不明白。
发布于 2018-02-23 05:31:19
PEMDAS
is P
,E
,MD
,AS
;乘法和除法具有相同的优先级,加法和减法也是如此。当除法运算符出现在乘法运算之前时,除法运算将首先进行。
Python运算符的执行顺序由operator precedence控制,并遵循相同的规则。具有较高优先级的运算符在优先级较低的运算符之前执行,但当它们在同一组中时,运算符具有匹配的优先级。
对于10-7//2*3+1
,您有两类运算符,从最低到最高:
+, -
(与AS
==加法和subtraction)*, @, /, //, %
相关(与MD
相关,so乘除)。因此首先执行//
和*
;乘法和除法属于同一组,而不是这里的固定顺序(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())
中,求值顺序如下:
现在它的参数是ready
c()
d()
*
,现在它的参数是ready
a()
b()
+
,现在它的参数是ready这是尽管*
和围绕乘法的圆括号具有很高的优先级。
发布于 2018-02-23 05:30:54
PEMDAS更好地表达为
P Parentheses, then
E Exponents, then
MD Multiplication and division, left to right, then
AS Addition and subtraction, left to right
所以在你的表达式中,除法应该在乘法之前完成,因为它在乘法的左边。完成这些操作后,再做减法和加法。
发布于 2018-02-23 05:29:57
这是有文档记录的here (Python文档/表达式/运算符优先级):
除外
https://stackoverflow.com/questions/48937457
复制相似问题