Python bool逻辑踩坑

621 阅读2分钟

逻辑运算

Python中用and, or, not 表示逻辑与,或,非。 其中and返回最后,或者导致短路的操作数;or返回第一真值或者最后的操作数

In [89]: 1 and 2   # 最后的操作数
Out[89]: 2

In [90]: 1 and 0 and 2   # 导致短路的操作数
Out[90]: 0

In [91]: 1 or 0 # 第一真值
Out[91]: 1

In [92]: 0 or 1 or 2 # 第一真值
Out[92]: 1

In [94]: False or 0 or 9 # 第一真值也是最后的操作数
Out[94]: 9

Python中的True和False

在Python中,None、任何数值类型中的0、空字符串“”、空元组()、空列表[]、空字典{}都被当作False,还有自定义类型,如果实现了  __ nonzero __ () 或 __ len __ () 方法且方法返回 0 或False,则其实例也被当作False,其他对象均为True。

当只有一个运算符时:

    True  and True    ==> True                  True  or True    ==> True
    True  and False   ==> False                 True  or False   ==> True
    False and True    ==> False                 False or True    ==> True
    False and False   ==> False                 False or False   ==> False

短路逻辑

  • 表达式从左至右运算,若or的左侧逻辑值为True,则短路or后所有的表达式(不管是and 还是or),直接输出or左侧表达式 。
  • 表达式从左至右运算,若and的左侧逻辑值为False,则短路其后所有and表达式,直到有or 出现,输出and左侧表达式到or的左侧,参与接下来的逻辑运算。
  • or的左侧为False,或者and的左侧为True则不能使用短路逻辑。

举个栗子:

def a():
    print("a is true")
    return True

def b():
    print("b is true")
    return True

def c():
    print("c is false")
    return False

def d():
    print("d is false")
    return False

print(a() and b() and c() and d())
print("*"*20)

print(a() or b() or c() or d())
print("*"*20)

print(a() and d() and c() and b())

执行结果:

a is true
b is true
c is false
False
********************
a is true
True
********************
a is true
d is false
False