对编程新手来说,一个常见的错误是对布尔运算符工作方式的误解,这是由于python解释器读取这些表达式的方式引起的。例如,在最初了解“ and”和“ or”语句之后,可以假设表达式X =('x'或'y')将检查变量X是否等于字符串'a中的一个'或'b'。事实并非如此。要理解,我要说的是,与解释器开始一个交互式会话,然后输入以下表达式:
>>> 'x' == ('x' or 'y') True >>> 'y' == ('x' or 'y') False >>> 'x' == ('x' and 'y') False >>> 'y' == ('x' and 'y') True
此时,and和or运算符似乎已损坏。对于前两个表达式,“ x”等效于“ x”或“ y”等效是没有意义的。此外,“ y”等同于“ x”和“ y”没有任何意义。在检查了解释器对布尔运算符的处理后,这些结果实际上与您对它们的要求完全相同,这与您认为的要求不同。
如果是或表达式,则python解释器会首先获取第一条语句并检查是否为true。当第一个语句为true时,python将返回该对象的值,而无需考虑第二个参数。这是因为对于or表达式,如果值之一为true,则整个情况为true;否则,结果为true。该程序不会查看第二条语句。但是,如果第一个对象的值计算为false,则python检查第二条语句并返回该值。由于后半部分为假,因此后半部分确定表达式的真值。解释器的这种“懒惰”被称为“短路”,是许多编程语言中评估布尔表达式的常用方式。
同样,对于和表达式,python使用短路技术来加快对真值的评估。如果第一个语句为假,则整个对象必须为假,并返回该对象值(假);否则,如果第一个值为true,则检查第二个值并返回该值。让我们看一下解释器在遍历代码时所“看到的”内容
'x' == ('x' or 'y') # Look at parentheses first, so evaluates "('x' or 'y")" # 'x' is a nonempty string, so the first value is True >>> 'x' == 'x' # the string 'x' is equivalent to the string 'x' , so our expression is True True
'y' == ('x' or 'y')# Look at parentheses first, so evaluates expression "('x' or 'y')" # 'x' is a nonempty string, so the first value is True #Return that first value : 'x' 'y' == 'x'# the string 'y' is not equivalent to the string 'x', so the expression is False
>>> 'x' == ('x' and 'y')# Look at parentheses first, so evaluate expression "('x' and 'y')" #'x' is a nonempty string, so the first value is True, examine second value # 'y' is a nonempty string, so second value is True #Return that second value as result of whole expression: 'y' >>> 'x' == 'y'# the string 'x' is not equivalent to the string 'y', so expression is False False
>>> 'y' == ('x' and 'y')# Look at parenthese first, so evaluates expression "('x' and 'y')" True # 'x' is a nonempty string, so the first value is True, examine second value # 'y' is a nonempty string, so second value is True # Return that second value as result of whole expression: 'y' >>> 'y' == 'y'# the string 'y' is equivalent to the string 'y', so expression is True True
短路评估意味着在评估诸如AND和OR之类的布尔表达式时,只要找到满足或否定该表达式的第一个条件,就可以立即停止。
短路由官方文档解释:
运作方式 | 结果 | 描述 |
---|---|---|
x或y | 如果x为假,则y为x | 仅当第一个参数为false时才评估第二个参数(y) |
x和y | 如果x为假,则x否则为y | 仅当第一个参数(x)为True时才计算第二个参数(y) |
不是x | 如果x为假,则为True,否则为False | 优先级比非布尔运算符低 |