python逻辑运算_一分钟看懂Python运算中的短路逻辑

504e9427e3708d7b322b6d3296976c4e.png

以下是最简单的逻辑运算:

 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.优先级 not >and > or

2.可以看做是False的类型有:None、任何数值类型的0、空字符串' '、空元组()、空列表[]、空字典{}

短路逻辑运算规则:

  • 表达式从左往右运算,如果or的左侧逻辑值为 true,则短路or后面的所有表达式(无论后面是and还是or等),直接输出or左侧表达式;如果or左侧的表达式逻辑值为false,则输出or后面的表达式,且不论后面表达式的真与假。
  • 表达式从左往右运算,如果and左侧逻辑值为false,则短路and后面所有表达式,直到有or出现,输出and左侧表达式到or的左侧,参与接下来的逻辑运算。
  • 如果or的左侧为false,或者and的左侧为true,则不能使用短路逻辑。

举例1:

 1> def a():
 2>  print 'A'
 3>  return []
 4> def b():
 5>  print 'B'
 6>  return []
 7> def c():
 8>  print 'C'
 9>  return 1
 10> def d():
 11>  print 'D'
 12>  return []
 13> def e():
 14>  print 'E'
 15>  return 1
 16>
 17> if a() and b() and c() and d() and e():
 18>  print 'ok'
 
 #显示结果如下
 A

分析:

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

举例2:

 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
 16>
 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:

 1> def a():
 2>  print 'A'
 3>  return 1
 4> def b():
 5>  print 'B'
 6>  return []
 7> def c():
 8>  print 'C'
 9>  return 1
 10> def d():
 11>  print 'D'
 12>  return []
 13> def e():
 14>  print 'E'
 15>  return 1
 16>
 17> if a() or b() or c() or d() or e():
 18>  print 'ok'

 #显示结果如下
 A
 ok

分析:

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

举例4:

 1> def a():
 2>  print 'A'
 3>  return []
 4> def b():
 5>  print 'B'
 6>  return []
 7> def c():
 8>  print 'C'
 9>  return 1
 10> def d():
 11>  print 'D'
 12>  return []
 13> def e():
 14>  print 'E'
 15>  return 1
 16>
 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。


下面我们就来讲一下 and 与 or 语句同时存在的情况:

举例5:

 1> def a():
 2>  print 'A'
 3>  return []
 4> def b():
 5>  print 'B'
 6>  return []
 7> def c():
 8>  print 'C'
 9>  return 1
 10> def d():
 11>  print 'D'
 12>  return []
 13> def e():
 14>  print 'E'
 15>  return 1
 16> def f():
 17>  print 'F'
 18>  return 1
 19> def g():
 20>  print 'G'
 21>  return []
 22> def h():
 23>  print 'H'
 24>  return 1
 25>
 26> if a() and b() and  c() and d() or e() and f() or g() and h():
 27>  print 'ok'

 #输出结果如下:
 A
 E
 F
 ok

分析:

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

这个条件 你可以看成: a() and b() and c() and d() ----> false ,打印A

or e() and f() ------> true,打印E 和 F,

or g() and h() ------> skip,短路

所以综上所述,AEFok。

三者优先级: not > and > or


扩展阅读:千峰视频讲解内容。

# or逻辑运算符做取值时,取第一个为true的值;如果所有的运算数都是false,取最后一个值

print(0 or [] or 'lisi' or 5 or 'ok')               # 结果为 lisi
print(0 or [] or {} or ())                          # 结果为 ()


# and逻辑做运算取值时,取第一个为false的值,如果所有的运算数都是true,取最后一个值
print(3 and 5 and 0 and 'hello')                    # 结果为 0
print(1 and 'good' and 'yes' and 'ok' and 100)      # 结果为 100


# and运算,所有结果为true,结果true
# 只要有一个运算数是false,结果就是false
4 > 3 and print('ok')                               # 结果为 ok
4 < 3 and print('hello')                            # 左边false,短路,无输出


# or逻辑运算,所有运算数都是false,结果才是false
# 只要有一个运算数是true,结果就是true
5 > 4 or print('哈哈哈')      # 左边为true,结束运算,输出左边,但没有输出命令,结果为空
5 < 4 or print('嘿嘿嘿')      # 输出结果为 嘿嘿嘿

原文>>> 一分钟看懂Python运算中的短路逻辑 - ≥NOOB≤

- END -

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值