对Python中的运算符优先权感到困惑

时间:2019-06-28 05:50:31

标签: python python-3.x operators logical-operators operator-precedence

我正在python解释器中处理逻辑表达式,但似乎无法弄清楚python到底使用了什么执行程序。我已经看到此表(http://www.mathcs.emory.edu/~valerie/courses/fall10/155/resources/op_precedence.html)描述了python使用的运算符优先级。

1)

print("this") or True and 1/0 and print("tester")

当我将其键入python解释器时,我得到“ this”的输出,然后是零除错误。但是,我提到的站点提到函数调用是第二高的优先级,因此不是应该首先执行两个print函数调用吗?我知道这里有短路评估,但是一旦您达到ands,nots和ors的优先级,那难道就不会发挥作用吗?

2)

True>False or print("hello")

即使这在python解释器上仅输出True。为什么不先执行print的功能调用?

3)

5 is 5 or 1/0

这将输出True。但是除法的优先级不应该比“是”高吗?该表达式是否应该返回ZeroDivsionError?

有人可以解释我所缺少的内容,以及如何判断python将执行逻辑表达式的顺序吗?

3 个答案:

答案 0 :(得分:1)

优先级顺序由解析器用来构造解析树。它与评估顺序不同。

以您的第三种情况为例:5 is 5 or 1/0。优先顺序为/> is> or

解析树看起来像这样(根据优先级。)

     or
   /    \
  is    div
 / \    / \
5   5  1   0

根据提供给代码生成器的另一条规则,评估(从技术上讲,代码生成)从顶部or节点开始。 or的代码生成器的输出可能看起来像这样。

t = code(5 is 5)
if t goto L1
L2: code(1/0)
    goto L1
L1:

优先顺序仅在最初用于创建解析树。解析树一旦构建,语义规则(动作?我忘记了单词)就会发挥作用。

短路行为内置于or节点的语义规则中。

p.s。这个答案不是专门针对Python的。

答案 1 :(得分:1)

  

有人可以解释我所缺少的内容,以及如何判断python将执行逻辑表达式的顺序吗?

优先级会影响在解析到树时将“共享”操作数分组的方式。除此之外,每个子表达式的特定评估模型都将接管。

print("this") or True and 1/0 and print("tester")

您将获得一棵看起来像这样的树(您可以使用ast模块和astpretty来获得更详细但更精确的版本):

    or
        print("this")
        and
             True
             and
                 1/0
                 print("tester")

然后评估(在编译为字节码之后,但不会改变操作顺序):

  1. 外部or被评估
    1. 它评估第一个print,它返回一个伪造的值,因此
    2. 它评估第一个and
      1. 它评估True是真实的
      2. 因此,它评估第二个and
        1. 评估1/0会爆炸

True>False or print("hello")

此解析为

or
   >
      True
      False
   print("hello")
  1. or评估其第一个操作数

    1. (> True False)的值为True

    or是一个短路运算符,它在找到真实值并返回该值时会立即停止,因此它永远不会到达print

5 is 5 or 1/0

此解析为

or
    is
        5
        5
    /
        1
        0
  1. or被评估

    1. is被求值,并返回True

    如上所述,or是短路运算符,它返回第一个真实值,因此它立即返回。

我遗漏了一些从技术上讲,/评估两个操作数,然后应用其操作,函数调用评估其所有参数,然后然后执行调用本身。

andor之所以脱颖而出,是因为它们在每个操作数求值之后执行逻辑,而不是在对所有操作数求值之后才执行逻辑(它们是惰性的/短路的):and返回它得到的第一个虚假结果,或者返回它得到的第一个真实结果,可能只求出它们的第一个操作数。

答案 2 :(得分:0)

优先级不会影响python计算语句的顺序。在5 is 5 or 1/0中,python首先检查5 is 5是否为true,如果是,它将忽略第二条语句。换句话说,无论优先级为何,python始终首先评估第一个语句