Python 上的操作顺序是如何进行的?

问题描述 投票:0回答:5

我的问题是这样的:

  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

我不明白。

python python-3.x math
5个回答
33
投票

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()
  • *
  • ,现在它的论点已经准备好了
    第二个
  • +
  • ,现在它的参数已经准备好了
    
    
    
  • 尽管
*

的优先级很高并且乘法周围有括号。

    


18
投票

    P
  • - 括号,然后
  • E
  • - 指数,那么
  • MD
  • - 乘法和除法,从左到右,然后
  • AS
  • - 加法和减法,从左到右
  • 所以在你的表达式中,除法应该在乘法之前完成,因为它位于乘法的左侧。完成这些之后,然后进行减法,然后进行加法。


5
投票
Python 上的运算顺序是如何进行的?

我不知道
PE(MD)(AS)

是什么,但 Python 的操作顺序(优先顺序)规则按照官方文档中的“运算符优先级”表所述进行。 :)

请记住,许多这些运算符优先级规则在 Python 中与

在 C

在 C++ 中是相反,但是这里是 Python 3 中的“运算符优先级”规则

要阅读表中的所有脚注,请单击上面的链接。

我还需要读书

PEMDAS:
    https://en.wikipedia.org/wiki/Order_of_operations#Mnemonics

4
投票
here

(Python 文档/表达式/运算符优先级):

乘法和除法(包括整数除法)发生在相同的优先级上,因此顺序由操作数分组的方向决定:
  • 所有乘法和除法的计算顺序都是从左到右(就像大多数二元运算一样,除幂运算除外)。

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.