我的问题是这样的:
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
我不明白。
zpgglvta1#
其中,PEMDAS是指P、E、MD、AS;乘法和除法有相同的优先级,加法和减法也一样。2当除法运算符出现在乘法之前时,除法运算符优先。Python操作符的执行顺序由操作符优先级决定,并且遵循相同的规则。优先级较高的操作符在优先级较低的操作符之前执行,但是当操作符在同一组中时,它们具有 matching 优先级。对于10-7//2*3+1,有2类运算符,从最低到最高:
PEMDAS
P
E
MD
AS
+, -
*, @, /, //, %
因此,首先执行//和*;乘法和除法属于同一个 group,而不是固定的顺序(MD并不意味着乘法在除法之前):
//
*
10 - ((7 // 2) * 3) + 1
因此,首先执行7 // 2,然后执行与3的乘法,然后从10中减去,最后加上1。我们已经忽略了一个问题,这个问题不会影响你的特定情况,但是对于编写真实的的Python程序来说非常重要。它并不决定计算的顺序,它实际上是关于 * 参数分组 *。PEMDAS说a + b + c * d作为(a + b) + (c * d)计算,但它没有说是先计算a + b还是先计算c * d。在数学中,你先计算什么并不重要,只要你尊重参数分组;在Python中,如果你先在a() + (b() + c())中计算b()和c(),仅仅因为它们在括号中,你可能会得到完全不同的结果,因为Python函数可能会有副作用。Python表达式的求值大多是从左到右进行的,例如,在a() + b() + (c() * d())中,求值顺序如下:
7 // 2
a + b + c * d
(a + b) + (c * d)
a + b
c * d
a() + (b() + c())
b()
c()
a() + b() + (c() * d())
a()
+
d()
尽管*的优先级很高,并且乘法运算周围有括号,但这仍然存在。
t3irkdon2#
PEMDAS更好地表示为
P Parentheses, then E Exponents, then MD Multiplication and division, left to right, then AS Addition and subtraction, left to right
所以在你的表达式中,除法应该在乘法之前完成,因为它在乘法的左边,完成这些之后,再做减法,然后再做加法。
zxlwwiss3#
Python的操作顺序是怎样的?我不知道PE(MD)(AS)是什么,但是Python的操作顺序(优先级顺序)规则是按照官方文档中的"运算符优先级"表来执行的。请记住,这些运算符优先级规则中有许多在Python中与in C或in C++是 * 相反的 *,但是下面是Python 3中的"运算符优先级"规则:
PE(MD)(AS)
yx2lnoni4#
这在这里进行了记录(Python文档/表达式/运算符-优先级):
wswtfjt75#
我认为python不遵循PEMDAS或BODMAS,除非你在它周围加上圆括号,所以基本上我必须在写程序之前在心里做这件事
5条答案
按热度按时间zpgglvta1#
其中,
PEMDAS
是指P
、E
、MD
、AS
;乘法和除法有相同的优先级,加法和减法也一样。2当除法运算符出现在乘法之前时,除法运算符优先。Python操作符的执行顺序由操作符优先级决定,并且遵循相同的规则。优先级较高的操作符在优先级较低的操作符之前执行,但是当操作符在同一组中时,它们具有 matching 优先级。
对于
10-7//2*3+1
,有2类运算符,从最低到最高:+, -
(与AS
== * 加减运算 * 相关)*, @, /, //, %
(与MD
相关,所以 * 乘法和除法 *)。因此,首先执行
//
和*
;乘法和除法属于同一个 group,而不是固定的顺序(MD
并不意味着乘法在除法之前):因此,首先执行
7 // 2
,然后执行与3的乘法,然后从10中减去,最后加上1。我们已经忽略了一个问题,这个问题不会影响你的特定情况,但是对于编写真实的的Python程序来说非常重要。它并不决定计算的顺序,它实际上是关于 * 参数分组 *。PEMDAS说
a + b + c * d
作为(a + b) + (c * d)
计算,但它没有说是先计算a + b
还是先计算c * d
。在数学中,你先计算什么并不重要,只要你尊重参数分组;在Python中,如果你先在
a() + (b() + c())
中计算b()
和c()
,仅仅因为它们在括号中,你可能会得到完全不同的结果,因为Python函数可能会有副作用。Python表达式的求值大多是从左到右进行的,例如,在
a() + b() + (c() * d())
中,求值顺序如下:a()
b()
+
,现在它的参数已准备就绪c()
d()
*
,现在它的参数已经准备好了+
,现在它的参数已准备就绪尽管
*
的优先级很高,并且乘法运算周围有括号,但这仍然存在。t3irkdon2#
PEMDAS更好地表示为
所以在你的表达式中,除法应该在乘法之前完成,因为它在乘法的左边,完成这些之后,再做减法,然后再做加法。
zxlwwiss3#
Python的操作顺序是怎样的?
我不知道
PE(MD)(AS)
是什么,但是Python的操作顺序(优先级顺序)规则是按照官方文档中的"运算符优先级"表来执行的。请记住,这些运算符优先级规则中有许多在Python中与in C或in C++是 * 相反的 *,但是下面是Python 3中的"运算符优先级"规则:
我仍需阅读
yx2lnoni4#
这在这里进行了记录(Python文档/表达式/运算符-优先级):
wswtfjt75#
我认为python不遵循PEMDAS或BODMAS,除非你在它周围加上圆括号,所以基本上我必须在写程序之前在心里做这件事