当前位置: 首页 > 知识库问答 >
问题:

Python`OR`、`AND`运算符优先级示例

骆磊
2023-03-14

我无法在Python中生成显示布尔运算符优先规则与短路评估相结合的示例。我可以使用以下方法显示运算符优先级:

print(1 or 0 and 0)  # Returns 1 because `or` is evaluated 2nd.

但当我把它改成这样时,短路的问题就显现出来了:

def yay(): print('yay'); return True
def nay(): print('nay')
def nope(): print('nope')
print(yay() or nay() and nope())  # Prints "yay\nTrue"

对于四种可能性中的每一种,当之前的表达式为true时,它是唯一的求值表达式。如果运算符优先级有效,则应打印“nay\nnope\nyay\ntrue”“nay\nyay\ntrue”(带有短路),因为应首先计算。

共有1个答案

高玮
2023-03-14

您混淆了运算符优先级和求值顺序。

表达式r=x或y和z不被计算为tmp=y和z;r=x或tmp,但正如r=x或(y和z)。该表达式从左到右求值,如果的结果已经确定,则(y和z)将完全不求值。

请注意,如果以及是函数,则会有所不同;在这种情况下,函数的参数将在调用函数本身之前求值。因此,operator.or_(yay(),operator.and_(nay(),nope()))打印yaynaynope,即它打印所有这三个,但仍然是从左到右的顺序。

您也可以将此推广到其他操作符。下面的两个表达式会由于运算符优先级的不同而产生不同的结果(使用(...),既有隐式的,也有显式的),但这两次都是从左到右调用函数。

>>> def f(x): print(x); return x
>>> f(1) + f(2) * f(3) / f(4) ** f(5) - f(6)         # 1 2 3 4 5 6 -> -4.99
>>> (f(1) + f(2)) * (((f(3) / f(4)) ** f(5)) - f(6)) # 1 2 3 4 5 6 -> -17.29

如注释中所指出的,在操作之间的术语从左到右进行评估的同时,实际操作是根据它们的优先级进行评估的。

class F:
    def __init__(self,x): self.x = x
    def __add__(self, other): print(f"add({self},{other})"); return F(self.x+other.x)
    def __mul__(self, other): print(f"mul({self},{other})"); return F(self.x*other.x)
    def __pow__(self, other): print(f"pow({self},{other})"); return F(self.x**other.x)
    def __repr__(self): return str(self.x)
def f(x): print(x); return F(x)

这样,表达式f(1)+f(2)**f(3)*f(4)就被计算为1,2,3,POW(2,3),4,MUL(8,4),ADD(1,32),即项从左到右求值(并推送到堆栈上),表达式的参数一求值就被计算。

 类似资料:
  • 问题内容: 下面的两个语句是否等效? 和 我可以使用某种真值表来验证这一点吗? 问题答案: 优先于,因此,即使 与…不同 因为那将被执行为 并且想要使它们相同,是以下内容(使用括号覆盖优先级规则): 这是一个示例说明:

  • 从高到低顺序如下: ^ not - (一元运算) * / + - ..(字符串连接) < > <= >= ~= == and or

  • 通过前面的学习我们知道运算符有不同的类型,当这些不同类型的运算符出现在同一个表达式中时,就必须遵循运算符的优先级来进行运算,才能保证运算的合理性和结果的正确性、唯一性。运算符的优先级决定了表达式中各个部分执行运算的先后顺序。 下表中详细介绍了 C# 中运算符的优先级顺序: 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[整型表达式] 左到右   () 圆括号 (表

  • 运算符的优先级决定了不同的运算符在表达式中计算的先后顺序,下表列出了 MySQL 中的各类运算符及其优先级。 优先级由低到高排列 运算符 1 =(赋值运算)、:= 2 II、OR 3 XOR 4 &&、AND 5 NOT 6 BETWEEN、CASE、WHEN、THEN、ELSE 7 =(比较运算)、<=>、>=、>、<=、<、<>、!=、 IS、LIKE、REGEXP、IN 8 | 9 & 10

  • 所有的数学运算都认为是从左向右运算的, Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。 乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。 一般而言,单目运算符优先级较

  • 主要内容:AND 运算符,语法,实例,OR 运算符,语法,实例SQLite 的 AND 和 OR 运算符用于编译多个条件来缩小在 SQLite 语句中所选的数据。这两个运算符被称为连接运算符。 这些运算符为同一个 SQLite 语句中不同的运算符之间的多个比较提供了可能。 AND 运算符 AND 运算符允许在一个 SQL 语句的 WHERE 子句中的多个条件的存在。使用 AND 运算符时,只有当所有条件都为真(true)时,整个条件为真(true)。例如,只