Python中 and 和 or 运算短路逻辑

Python中 and 和 or 运算短路逻辑
Python入门教程100天
专栏收录该内容
129 篇文章6 订阅
订阅专栏
短路逻辑规则如下:
表达式从左至右运算,若 or 的左侧逻辑值为 True ,则短路 or 后所有的表达式(不管是 and 还是 or),直接输出 or 左侧表达式 。若 or 的左侧逻辑值为 False ,则输出or右侧的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果。
表达式从左至右运算,若 and 的左侧逻辑值为 False ,则短路其后所有 and 表达式,直到有 or 出现,输出 and 左侧表达式到 or 的左侧,参与接下来的逻辑运算。若 and 的左侧逻辑值为 True,则输出其后的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
若 or 的左侧为 False ,或者 and 的左侧为 True 则不能使用短路逻辑。
注意:
1、在Python中and的优先级是大于or的,而且and和or都是会返回值的并且不转换为True和False。当not和and及or在一起运算时,优先级为是not>and>or
2、在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
接下来我们再举一个具体的例子:
先来定义一组函数:
1>  def a():
    2>     print (‘A’)
    3>     return 1
    4>  def b():
    5>     print (‘B’)
    6>     return 1
    7>  def c():
    8>     print (‘C’)
    9>     return []
    10> def d():
    11>    print (‘D’)
    12>    return []
    13> def e():
    14>    print (‘E’)
    15>    return 1
例1:
17> if a() and b() and c() and d() and e():
    18>    print (‘ok’)
    #显示结果如下
    A
a() 为假 ,其后均为 and 语句,全部短路,*终只返回 a() 的表达式。记住,所有被短路的表达式均不会被输出。所以,此处仅仅打印 A
例2:
17> if a() and b() and c() and d() and e():
    18>    print (‘ok’)
    #显示结果如下
    A
    B
    C
python 从左至右先执行 a() ,a() 返回的逻辑值为 True,后面是 and 语句,所以不能短路其后,继续与 b() 进行逻辑运算,a() and b() 输出 b() 的逻辑值 True,接着与 c() 进行逻辑运算,b() and c() 输出 c() 的逻辑值 False,而其后均为 and 语句, 则全部短路,*终只打印了 A B C 。
例3:
17> if a() or b() or c() or d() or e():
    18>    print (‘ok’)
    #显示结果如下
    A
    Ok
    #显示结果如下
    A
    ok
a() 的逻辑值为 True ,其后均为 or 语句,全部短路,*终只打印了 A,而 if 语句为 True ,所以还要打印一个 ok。
例4:
    17> if a() or b() or c() or d() or e():
    18>    print (‘ok’)
    #显示结果如下
    A
    B
    C
    Ok
python 从左至右先执行 a() ,a() 返回的逻辑值为 False,后面是 or 语句,所以不能短路其后,继续与 b() 进行逻辑运算,a() or b() 输出 b() 的逻辑值 False,接着与 c() 进行逻辑运算,b() or c() 输出 c() 的逻辑值 True,而其后为 or 语句, 则全部短路,*终只打印了 A B C ok。
例5:
 26> if a() and b() and  c() and d() or e() and f() or g() and h():
    27>    print (‘ok’)
    #输出结果如下:
    A
    E
    F
    Ok
别以为语句很长就很难,我们好好分析一下,从左至右,首先a() 的逻辑值为 False,其后到 or 语句为止有三个 and 语句: a() and b() and c() and d(),均被短路。只输出 a(), 得到 a() or e() 为True,输出 e() ,得 e() and F() 为 True ,输出 f(), 其后接 or 语句,则短路其后所有。*终只打印了A E F ok 。

Python中 and 和 or 运算短路逻辑

Python中 and 和 or 运算短路逻辑

短路逻辑规则如下:

表达式从左至右运算,若 or 的左侧逻辑值为 True ,则短路 or 后所有的表达式(不管是 and 还是 or),直接输出 or 左侧表达式 。若 or 的左侧逻辑值为 False ,则输出or右侧的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果。

 

表达式从左至右运算,若 and 的左侧逻辑值为 False ,则短路其后所有 and 表达式,直到有 or 出现,输出 and 左侧表达式到 or 的左侧,参与接下来的逻辑运算。若 and 的左侧逻辑值为 True,则输出其后的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果

若 or 的左侧为 False ,或者 and 的左侧为 True 则不能使用短路逻辑。

注意:

1、在Python中and的优先级是大于or的,而且and和or都是会返回值的并且不转换为True和False。当not和and及or在一起运算时,优先级为是not>and>or

2、在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
接下来我们再举一个具体的例子:

先来定义一组函数:

1>  def a():

2>     print (‘A’)

3>     return 1

4>  def b():

5>     print (‘B’)

6>     return 1

7>  def c():

8>     print (‘C’)

9>     return []

10> def d():

11>    print (‘D’)

12>    return []

13> def e():

14>    print (‘E’)

15>    return 1
例1:

17> if a() and b() and c() and d() and e():

18>    print (‘ok’)

#显示结果如下

A
a() 为假 ,其后均为 and 语句,全部短路,*终只返回 a() 的表达式。记住,所有被短路的表达式均不会被输出。所以,此处仅仅打印 A

 

例2:

17> if a() and b() and c() and d() and e():

18>    print (‘ok’)

#显示结果如下

A

B

C
python 从左至右先执行 a() ,a() 返回的逻辑值为 True,后面是 and 语句,所以不能短路其后,继续与 b() 进行逻辑运算,a() and b() 输出 b() 的逻辑值 True,接着与 c() 进行逻辑运算,b() and c() 输出 c() 的逻辑值 False,而其后均为 and 语句, 则全部短路,*终只打印了 A B C 。

 

例3:

17> if a() or b() or c() or d() or e():

18>    print (‘ok’)

#显示结果如下

A

Ok

#显示结果如下

A

ok
a() 的逻辑值为 True ,其后均为 or 语句,全部短路,*终只打印了 A,而 if 语句为 True ,所以还要打印一个 ok。

 

例4:

17> if a() or b() or c() or d() or e():

18>    print (‘ok’)

#显示结果如下

A

B

C

Ok
python 从左至右先执行 a() ,a() 返回的逻辑值为 False,后面是 or 语句,所以不能短路其后,继续与 b() 进行逻辑运算,a() or b() 输出 b() 的逻辑值 False,接着与 c() 进行逻辑运算,b() or c() 输出 c() 的逻辑值 True,而其后为 or 语句, 则全部短路,*终只打印了 A B C ok。

 

例5:

26> if a() and b() and  c() and d() or e() and f() or g() and h():

27>    print (‘ok’)

#输出结果如下:

A

E

F

Ok
别以为语句很长就很难,我们好好分析一下,从左至右,首先a() 的逻辑值为 False,其后到 or 语句为止有三个 and 语句: a() and b() and c() and d(),均被短路。只输出 a(), 得到 a() or e() 为True,输出 e() ,得 e() and F() 为 True ,输出 f(), 其后接 or 语句,则短路其后所有。*终只打印了A E F ok 。