![504e9427e3708d7b322b6d3296976c4e.png](https://i-blog.csdnimg.cn/blog_migrate/1c14802091c837dd7ff3a4e1ece27f18.jpeg)
以下是最简单的逻辑运算:
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 -