Python中的短路技术?

对编程新手来说,一个常见的错误是对布尔运算符工作方式的误解,这是由于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
优先级比非布尔运算符低