Python内置类型(1)——真值测试
python中任何对象都能直接进行真假值的测试,用于if或者while语句的条件判断,也可以做为布尔逻辑运算符的操作数
python中任何对象都能直接进行真假值的测试,而不需要额外的类型转换
这一点是和其它语言不一样的。比如C#,一个非bool的对象,如果要进行逻辑判断则必须先强制进行类型转换、或者调用对象的自身判断方法进行判断。
var message = " ";
if (message.IsNullOrEmpty()){
...
}
而python中可以直接对对象进行逻辑判断无需类型转换
message = " "
if message :
pass
对象的真假值测试的结果,要么是True,要么是False
布尔类型的值只有True和False,所以对象是不管什么类型,其真假值的测试结果必然是True和False中的一个。在python中真假值的测试结果可以通过调用内置函数bool来确认。
>>> bool(' ')
True
>>> bool('')
False
以下的内置对象会被视为False值
- None
>>> bool(None)
False
- False
>>> bool(False)
False
- 任何数值类型的零,例如,0、0.0、0j
>>> bool(0),bool(0.0),bool(0j)
(False, False, False)
- 任何空序列,例如,”、()、[]
>>> bool(''),bool(()),bool([])
(False, False, False)
- 任何空映射,例如,{}
>>> bool({})
False
内置对象除了以上值之外的都是真值
常量NotImplemented、Ellipsis、True是真值
>>> bool(NotImplemented)
True
>>> bool(Ellipsis)
True
>>> bool(True)
True
对于用户自定义的类,其真假值取决于该类有没有定义__bool__()
或__len__()
,以及这两个方法返回的值
如果自定义类未没有定义__bool__()
和__len__()
方法,则该类的实例对象的真假值测试总是True。
>>> class A:
pass
>>> a = A()
>>> bool(a)
True
如果自定义类只定义了__bool__()
方法,则该类的实例对象的真假值测试结果为__bool__()
方法返回的结果
>>> class B():
def __init__(self,name):
self.name = name
def __bool__(self):
return bool(self.name)
>>> b1 = B('')
>>> bool(b1)
False
>>> b2 = B('jay')
>>> bool(b2)
True
如果自定义类只定义了__len__()
方法,则该类的实例对象的真假值测试结果为__len__()
方法返回的结果是否为整数0
>>> class C():
def __init__(self,name):
self.name = name
def __len__(self):
return len(self.name)
>>> c1 = C('')
>>> bool(c1)
False
>>> c2 = C('jay')
>>> bool(c2)
True
如果自定义类同时定义了__bool__()
和__len__()
方法,则该类的实例对象的真假值测试结果为__bool__()
方法返回的结果,即__bool__()
方法优先级高于__len__()
方法。
>>> class D():
def __len__(self):
return 1
def __bool__(self):
return False
>>> d = D()
>>> bool(d)
False
>>> class E():
def __len__(self):
return 0
def __bool__(self):
return True
>>> e = E()
>>> bool(e)
True
欢迎关注公众号交流:
Python内置类型(1)——真值测试的更多相关文章
- 为什么继承 Python 内置类型会出问题?!
本文出自"Python为什么"系列,请查看全部文章 不久前,Python猫 给大家推荐了一本书<流畅的Python>(点击可跳转阅读),那篇文章有比较多的"溢 ...
- Python内置类型性能分析
Python内置类型性能分析 timeit模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass' ...
- Python 内置类型 dict, list,线程安全吗
近段时间发现一个 Python 连接数据库的连接是线程不安全的,结果惹得我哪哪儿都怀疑变量的多线程是否安全的问题,今天终于找到了正确答案,那就是 Python 内置类型 dict,list ,tupl ...
- python内置类型详细解释
文章编写借鉴于内置类型 - Python 3.7.3 文档,主要用于自己学习和记录 python主要内置类型包括数字.序列.映射.类.实例和异常 有些多项集类是可变的.它们用于添加.移除或重排其成员的 ...
- Python——内置类型
Python定义了丰富的数据类型,包括: 数值型:int, float, complex 序列:(iterable) str, unicode, tuple, list, bytearray, buf ...
- Python内置类型(2)——布尔运算
python中bool运算符按优先级顺序分别有or.and.not, 其中or.and为短路运算符 not先对表达式进行真值测试后再取反 not运算符值只有1个表达式,not先对表达式进行真值测试后再 ...
- 易被忽略的Python内置类型
Python中的内置类型是我们开发中最常见的,很多人都能熟练的使用它们. 然而有一些内置类型确实不那么常见的,或者说往往会被我们忽略,所以这次的主题就是带领大家重新认识这些"不同寻常&quo ...
- Python内置类型——set
Python中,内置类型set和frozenset用来表示集合,我们首先查看这两个类型支持的特殊对象,从而可以理解他们的特性. >>> dir(set) ['__and__', '_ ...
- 3、python内置类型(0529)
python的内置对象类型以及支持的运算 python对象的相关术语 python程序中保存的所有数据都是围绕对象这个概念展开的 程序中存储的所有数据都是对象 每个对象都有一个身份.一个类型和一个值 ...
随机推荐
- python下划线的5种含义
本文介绍了Python中单下划线和双下划线("dunder")的各种含义和命名约定,名称修饰(name mangling)的工作原理,以及它如何影响你自己的Python类. 单下划 ...
- Django的rest_framework的视图之基于ModelViewSet视图源码解析
前言 今天一直在整理Django的rest_framework的序列化组件,前面一共写了2篇博客,前面的博客给的方案都是一个中间的状态的博客,其中有很多的冗余的代码,如果有朋友不清楚,可以先看下我前面 ...
- SQL Server 2008 R2 链接 Oracle
参考网站: SP_addlinkedserver 小结 (oracle,sql server,access,excel) 64位SqlServer通过链接服务器与32位oracle通讯 SQL Ser ...
- spring rabbitmq集成
pom.xml加 <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-clien ...
- Python 多个分隔符 读取逗号和空格分开的数据
str.split() 清除默认 空格和tab 对空格数量不敏感 str.split(' ') 只清除一个空格 对空格数量敏感 l = re.split('[^0-9.]+',s.stri ...
- 【APP测试(Android)】--客户端数据库
- MSSQL语句学习(查询表的总记录数)
如何高效查询表的总记录数(通用方法) SELECT COUNT(1) ROWS FROM product 野路子1:利用系统自带的存储过程SP_SPACEUSED,详细的使用方式推荐谷哥或度娘, EX ...
- delphi 中record 的类操作符重载简介
今天简单介绍一下 delphi 中record 的类操作符重载使用,就是如何 实现 record 之间的简单操作. 关于类操作符重载 ,大家可以看官方的文档. Delphi allows certai ...
- 【NOIP2013/Codevs3287】货车运输-最小生成树(大)-树上倍增
https://www.luogu.org/problemnew/show/P1967 由题可知,我们走的路的边应尽可能大,所以通过kruscal建最大生成树的图,再树上倍增,注意可能有多棵树; #i ...
- sock5客户端解密数据流
一.安装 略 二.配置 vi /etc/shadowsocks.json { "server":"x.x.x.x", , , "password&qu ...