python布尔类型和逻辑运算
布尔类型
python中True表示真,False表示假,它们是布尔类型:
>>> type(True)
<class 'bool'>
在python中,bool的True和False是数值1和0的字符串表示格式,实际上bool类型是int类型的一个子类。
>>> bool.__bases__
(<class 'int'>,)
因为True/False是数值1和0的另一种表示方式,它们可以直接参与数值运算。
>>> True + 2
3
>>> False + 2 - 1
1
True/False的各种形式
虽然True代表1,False代表0。但实际上,python中的任何一个数据对象要么是True,要么是False,所以可以直接在布尔测试的表达式中使用,而并非一定要去大小比较、通过函数测试等等。比如:
if "a":
while 1:
可以通过bool()函数来测试数据对象、表达式是True还是False。例如:
>>> bool(0)
False
>>> bool(1)
True
>>> bool('a')
True
>>> bool('')
False
那么,哪些类型的数据是True,哪些类型的数据是False?
- 整数值0、浮点数值0.0等、空字符串都为假
- None为假
- 空数据对象都是假,比如
[]、{}、()等- 注意,元组的括号和逗号的特殊性。例如
(())、(None)、(1)这些都不是元组,而是单个数据对象,加上逗号才算是元组。所以,使用括号包围但却不是元组的数据,如果它们是假,则整个返回假,而不是元组看上去不为空而返回真
- 注意,元组的括号和逗号的特殊性。例如
以下是各种内置数据类型的一些真、假示例:
True False
----------------------------------
number: 1、1.1 0、0.0
string: 'a' ''
None: None
list: ['a']、[1] []
[0]、['']、[None]
Set/Dict: {'a'} {}
tuple: ('a')、(1) ()、('')、(0)、(None)
看几个示例:
>>> bool(1), bool(0)
(True, False)
>>> bool('a'), bool('')
(True, False)
>>> bool(None)
False
>>> bool(['a']), bool([1]), bool([]), bool(['']), bool([()])
(True, True, False, True, True)
>>> bool({'a'}), bool({}), bool({''})
(True, False, True)
>>> bool(('a')), bool(()), bool(('')), bool((0)), bool(({}))
(True, False, False, False, False)
>>> bool(((),)),bool((None,))
(True, True)
实际上,一个数据对象是真还是假,是根据这个类型的__bool__()的返回值(为False则为假)以及__len__()的返回值(为0则为假)来决定的。
None
None为假,它不是表示对象为空,也不是表示对象未定义。它自身就是一个实实在在的数据对象,在内存中有自己的内存地址,而且整个python全局只有一个唯一的None对象。可以认为,None是一种特殊的数据对象,像数值1、字符串'a'一样,只不过内存中这个数据对象里面存储的数据是我们不得而知的,但它永远表示为False。
>>> a = None
>>> b = None
>>> a is b
True
在Python中,没有显式定义return语句的函数、方法并不意味着没有返回值,它们的默认返回值是None。比如print()函数:
>>> a=print("aa")
aa
>>> print(a)
None
None有时候有些小技巧。比如,访问或设置超出列表长度的元素时会报错:
>>> S = []
>>> S[1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> S[1] = 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
但是可以预先将某些数量的None对象填充到列表中去,这样列表就具备了元素,尽管它们都是None对象。
例如,向列表中填充10个None元素:
>>> S = [None] * 10
>>> S
[None, None, None, None, None, None, None, None, None, None]
>>> S[1]
>>> S[1] = 2
>>> S
[None, 2, None, None, None, None, None, None, None, None]
当然,将None换成其它数据也一样可以,比如0,但用None来填充,一看就知道是为了填充而填充的占位符,不是实际要操作的元素。
另外,预先填充并不能限制列表的长度,可以继续向这个列表中append()新元素。
逻辑运算:and、or、not
python中只支持字符形式的and、or、not逻辑运算,不支持符号类型的&&、||、!。
- X and Y:X和Y都为真时,返回真
- X or Y:X或Y为真,返回真
- not X:X真假取反
- not优先级很低,所以
not a == b等价于not (a == b)
- not优先级很低,所以
需要注意,and和or会短路运算(即只要能确定真假关系,就立即停止运算),并返回运算的结果(不是返回True/False,而是返回表达式的运算结果)。而not运算是返回True/False的。
例如,and的逻辑运算:
>>> 2 and 3, 3 and 2
(3, 2)
>>> [] and {}
[]
>>> 3 and []
[]
上面第一行and测试,因为and左边的都是True,所以必须得评估and右边的值,那么不管and右边是True还是False,都会返回and右边的值,比如第一行and测试,第三行and测试。第二行and测试中,因为and左边为False,所以直接能确定为False,所以直接短路返回[]。
再看or逻辑运算:
>>> 2 or 3,3 or 2
(2, 3)
>>> [] or 3
3
>>> [] or {}
{}
上面第一行or测试,因为or左边已经能直接确定为True,所以直接短路返回or左边的值。第二行和第三行or测试,因为or左边都为False,所以必须测试右边的,所以不管or右边是True还是False,都返回or右边的值。
再次说明,and、or返回的不是True/False的布尔值,而是逻辑表达式的运算结果。但因为python中只要是数据,要么是True,要么是False,所以and/or/not都可以用于真假测试,只不过and/or还可以在布尔测试的基础上进行赋值操作。
例如,如果变量a为False,就赋值为某个值,否则采用a原有的值。
a = a or "hhhh"
更通用的,变量A取X、Y、Z等表达式中的一个。
A = X or Y
A = X or Y or Z
不仅如此,and/or还能实现if中选择值的功能。例如,下面是等价的:
A = (( X and Y) or Z)
if X:
A = Y
else:
A = Z
当然,这种用and/or实现逻辑的可读性太差,能用if的当然用if。
空、非空测试的建议
经常会遇到要测试数据是否为空。这里的空可能是None、""、[]、{}、()中的一种,建议不要使用len() == 0去测试:
if len(x) == 0:
if not len(x) == 0:
而是直接将数据作为真、假值进行判断:
if x:
if not x:
python布尔类型和逻辑运算的更多相关文章
- python布尔类型
布尔类型 python当中下面的值在作为布尔表达式时,会被解释器看作False: 1.None: 2.False: 3.任何为0的数字类型,如:0,0.0,0j: 4.任何空序列,如:'',(),[] ...
- Python 学习 第一篇:数据类型(数字,集合,布尔类型,操作符)
Python语言最常用的对象是变量和常量,常量的值是字面意思,其值是不可变的,变量的值是可变的,例如,123,"上海"是常量,而a=1,a=2,其中a是变量名.内置的核心数据类型有 ...
- Python中布尔类型
我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算:与运算:只有两个布尔值都为 True 时,计算结果才为 True.True and T ...
- 9.python的布尔类型与流程控制
布尔类型其实可以算是一种特殊的数字,下面是 help() 函数得到的帮助信息: Help on class bool in module __builtin__: class bool(int) | ...
- Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)
提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...
- python学习第三天 --布尔类型
我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算: 与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and ...
- 初学Python之 布尔类型
与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and True # ==> True True and False # ==> False False an ...
- python的布尔类型与流程控制
布尔类型其实可以算是一种特殊的数字,下面是 help() 函数得到的帮助信息: bool 首先,请注意这一行:
- Python 入门(三)整数和浮点数+布尔类型
整数和浮点数 Python支持对整数和浮点数直接进行四则混合运算,运算规则和数学上的四则运算规则完全一致. 基本的运算: 1 + 2 + 3 # ==> 6 4 * 5 - 6 # ==> ...
随机推荐
- Python if __name__ == '__main__':
python属于脚本语言,只能逐行运行, if __name__ == '__main__':这句相当于main(),即首先执行这条语句.
- CUDA 计算线程索引的一般公式
CUDA thread index: int blockId = blockIdx.z * (gridDim.x*gridDim.y) + blockIdx.y ...
- OPC转发阿里云alink工具
这个最近还在做 2019-04-24 今天抽空吧基本mqtt上传,OPC遍历,导出物模型功能先做了 上报操作日志,上报错误信息,导入参数,导出参数还没做 有需要可以联系微信NBDX123
- ef core 相关
1.为什么使用ef core? 市面上orm框架那么多,为何偏偏选择ef,dapper那么好用,性能碾压ef,为什么使用dapper? 对于这个问题我记得当初一个老师讲entityframework的 ...
- lightoj 1074
这题怎么说呢,负环上的点都不行 网上也有很多解法 我用dfs的spfa解的 我发现网上别人的代码都是用bfs的spfa写的,我就用的dfs的,快了好多 代码还看的别人的,只有中间的spfa是自己写的 ...
- kSum问题总结
1.2Sum 题目: 方法一:两次迭代 public class TwoSum { public static int[] twoSum(int[] nums, int target) { int[] ...
- DOM1级问题与DOM2级事件
前几天有小伙伴问过我一个问题,为什么有DOM 0级事件以及DOM2级事件,但是却没有DOM1级事件呢?那我们今天就来说一说DOM的级别问题. 同时推荐伙伴们可以看看尚学堂有关JavaScript BO ...
- sublimeText3编辑器 + 入门教程 + 使用大全
sublimeText3编辑器 + 入门教程 + 使用大全 Ctrl+D选中光标所占的文本,继续操作则会选中下一个相同的的文本 ctrl+G:输入行号,可快速跳转该行 ctrl+p:输入冒号,在输入行 ...
- 第35节:Java面向对象中的多线程
Java面向对象中的多线程 多线程 在Java面向对象中的多线程中,要理解多线程的知识点,首先要掌握什么是进程,什么是线程?为什么有多线程呢?多线程存在的意义有什么什么呢?线程的创建方式又有哪些?以及 ...
- Kali学习笔记31:目录遍历漏洞、文件包含漏洞
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 目录遍历漏洞: 应用程序如果有操作文件的功能,限制不严 ...