11

在 Python 中,我们可以这样做:

if True or blah:
    print("it's ok") # will be executed

if blah or True: # will raise a NameError
    print("it's not ok")

class Blah:
    pass
blah = Blah()

if blah or blah.notexist:
    print("it's ok") # also will be executed
  • 有人可以指点我有关此功能的文档吗?
  • 它是语言的实现细节还是特性?
  • 利用此功能是一种好的编码风格吗?
4

4 回答 4

30

短路or,参见布尔运算文档:and

表达式x and y首先计算x; 如果x为假,则返回其值;否则,y评估并返回结果值。

表达式x or y首先计算x; 如果x为真,则返回其值;否则,y评估并返回结果值。

请注意,andy当评估为 True 值时,才会评估 for 。x相反,对于or,y仅在x评估为 False 值时才评估。

对于第一个表达式True or blah,这意味着它blah永远不会被评估,因为第一部分已经是True

此外,您的自定义Blah类被认为是 True:

在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为 false:False、、None所有类型的数字零,以及空字符串和容器(包括字符串、元组、列表、字典、集合和冻结集)。所有其他值都被解释为 true。(有关__nonzero__()更改此设置的方法,请参见特殊方法。)

由于您的类没有实现__nonzero__()方法(也没有__len__方法),因此就True布尔表达式而言,它被认为是。

在表达式blah or blah.notexist中,blah因此为真,并且blah.notexist从不计算。

经验丰富的开发人员经常有效地使用此功能,通常用于指定默认值:

some_setting = user_supplied_value or 'default literal'
object_test = is_it_defined and is_it_defined.some_attribute

请注意链接这些并在适用的情况下使用条件表达式。

于 2013-04-17T20:21:38.077 回答
6

这称为短路,是该语言的一个特性:

http://docs.python.org/2/tutorial/datastructures.html#more-on-conditions

布尔运算符andor是所谓的短路运算符:它们的参数从左到右进行评估,一旦确定结果,评估就会停止。例如,如果 A 和 C 为真但 B 为假,则 A 和 B 和 C 不计算表达式 C。当用作一般值而不用作布尔值时,短路运算符的返回值是最后一个评估的论点。

于 2013-04-17T20:21:21.370 回答
3

这是运算符逻辑运算符的方式,特别or是在 python 中的工作方式:短路评估。

为了更好地解释它,请考虑以下几点:

if True or False:
    print('True') # never reaches the evaluation of False, because it sees True first.

if False or True:
    print('True') # print's True, but it reaches the evaluation of True after False has been evaluated.

有关更多信息,请参阅以下内容:

于 2013-04-17T20:21:28.580 回答
2

使用or运算符,从左到右计算值。在一个值计算为 之后True,整个语句的计算结果为True(因此不再计算更多值)。

  • 官方文档
  • 这是语言的一个特点
  • 使用它的功能没有错
于 2013-04-17T21:52:21.160 回答