Python中的命题与判断
计算机是一种智力工具。在程序中注入判断机制,就能使它具有了最基本的智能。判断是对思维对象是否存在、是否具有某种属性以及事物之间是否具有某种关系的肯定或否定。在形式逻辑上,判断就是决定命题真伪的过程。由此才能决定如何选择以及是否需要重复。
布尔类型
任何条件都以命题为前提,要以命题的真、假来决定对某一选择说yes还是no。所以,条件是一种只有True和False取值空间的表达式。这种类型称为布尔类型。
需要注意的是,True和False都是字面量,也是保留字。
在底层,True被解释为1,False被解释为0。所以,常常把布尔;类型看做一种特殊的int类型。进一步扩展,把一切空(0、空白、空集、空序列)都可以当做False,把一切非空(有、非0、非空白、非空集、非空序列)都当做True。
>>> True+1
2
>>> False+1
1
>>> int(True)
1
>>> int(False)
0
>>> 1.+1.e-16>1 #不宜对过小的浮点数进行比较操作
False
>>> 1.+1.e-15>1
True
>>> a=1+1>3 #先计算1+1得到2,再计算2>3,得到False,再将a指向False
>>> a
False
>>> 2>3>1 #先计算2>3,得到False,再计算False>1,得到Fasle
False
逻辑表达式
1.逻辑运算的基本规则
逻辑运算也称为布尔运算。其基本运算只有3种:not(非)、and(与)、or(或)
一些结论:
(1)在下列两种情况下,表达式的值和类型都随a。
<1>a为True时的a or b。
<2>a为False时的a and b。
(2)在下列两种情况下,表达式的值和类型都随b。
<1>a为True时的a and b。
<2>a为False时的a or b。
(3)最后执行not操作的表达式,其结果一定是布尔类型。
(4)逻辑运算符适合于对任何对象的操作。
(5)3个逻辑操作符的优先级不一样。
<1>not的优先级最高,比乘除高,比幂低,是右优先结合。
<2>and、or的优先级比比较操作符和算术操作符低,比赋值高。它们都是左优先结合。
>>> a=True
>>> b=2;a and b;type(a and b);a or b;type(a or b)
2
<class 'int'>
True
<class 'bool'>
>>> b=0;a and b; type(a and b);a or b;type(a or b)
0
<class 'int'>
True
<class 'bool'>
>>> a=False
>>> b=2;a and b;type(a and b);a or b;type(a or b)
False
<class 'bool'>
2
<class 'int'>
>>> b=0;a and b;type(a and b);a or b;type(a or b)
False
<class 'bool'>
0
<class 'int'>
>>> a=1;not a
False
>>> a=0;not a
2.短路逻辑
由上面的讨论可以得到以下结论:
(1)对于表达式a and b,如果a为False,表达式就已经确定,就可以立即返回False,而不管b的值是什么,所以就不需要再执行子表达式b。实际上几乎所有的程序设计语言,也不再执行表达式b。
(2)对于表达式a or b,如果a为True,表达式就已经确定,就可以立刻返回True,而不管b的值是什么,所以就不需要再执行子表达式b。实际上几乎所有的程序设计语言,也不再执行表达式b。
这两种执行方式都被称为短路逻辑或惰性逻辑,即第2个子表达式被短路了,从而避免了无用地执行代码。这是一个程序设计中可以用到的技巧,但使用时须注意两个参与运算的表达式中不能包含有副作用的操作,如赋值。不过,Python中已经把在任何布尔表达式中有副作用的表达式全部看做语法错误。
>>> a>2 and (a=5>2)
SyntaxError: invalid character in identifier
>>> (a=5)<3
SyntaxError: invalid syntax
>>> (a=True) and 3>5
SyntaxError: invalid syntax
>>> !(a=True)
SyntaxError: invalid syntax
>>> a=5<3
>>> a
False