我正在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将执行逻辑表达式的顺序吗?
答案 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")
然后评估(在编译为字节码之后,但不会改变操作顺序):
or
被评估
print
,它返回一个伪造的值,因此and
True
是真实的and
1/0
会爆炸True>False or print("hello")
此解析为
or
>
True
False
print("hello")
or
评估其第一个操作数
(> True False)
的值为True
or
是一个短路运算符,它在找到真实值并返回该值时会立即停止,因此它永远不会到达print
5 is 5 or 1/0
此解析为
or
is
5
5
/
1
0
or
被评估
is
被求值,并返回True
如上所述,or
是短路运算符,它返回第一个真实值,因此它立即返回。
我遗漏了一些从技术上讲,/
评估两个操作数,然后应用其操作,函数调用评估其所有参数,然后然后执行调用本身。
and
和or
之所以脱颖而出,是因为它们在每个操作数求值之后执行逻辑,而不是在对所有操作数求值之后才执行逻辑(它们是惰性的/短路的):and
返回它得到的第一个虚假结果,或者返回它得到的第一个真实结果,可能只求出它们的第一个操作数。
答案 2 :(得分:0)
优先级不会影响python计算语句的顺序。在5 is 5 or 1/0
中,python首先检查5 is 5
是否为true,如果是,它将忽略第二条语句。换句话说,无论优先级为何,python始终首先评估第一个语句