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)——真值测试的更多相关文章

  1. 为什么继承 Python 内置类型会出问题?!

    本文出自"Python为什么"系列,请查看全部文章 不久前,Python猫 给大家推荐了一本书<流畅的Python>(点击可跳转阅读),那篇文章有比较多的"溢 ...

  2. Python内置类型性能分析

    Python内置类型性能分析 timeit模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass' ...

  3. Python 内置类型 dict, list,线程安全吗

    近段时间发现一个 Python 连接数据库的连接是线程不安全的,结果惹得我哪哪儿都怀疑变量的多线程是否安全的问题,今天终于找到了正确答案,那就是 Python 内置类型 dict,list ,tupl ...

  4. python内置类型详细解释

    文章编写借鉴于内置类型 - Python 3.7.3 文档,主要用于自己学习和记录 python主要内置类型包括数字.序列.映射.类.实例和异常 有些多项集类是可变的.它们用于添加.移除或重排其成员的 ...

  5. Python——内置类型

    Python定义了丰富的数据类型,包括: 数值型:int, float, complex 序列:(iterable) str, unicode, tuple, list, bytearray, buf ...

  6. Python内置类型(2)——布尔运算

    python中bool运算符按优先级顺序分别有or.and.not, 其中or.and为短路运算符 not先对表达式进行真值测试后再取反 not运算符值只有1个表达式,not先对表达式进行真值测试后再 ...

  7. 易被忽略的Python内置类型

    Python中的内置类型是我们开发中最常见的,很多人都能熟练的使用它们. 然而有一些内置类型确实不那么常见的,或者说往往会被我们忽略,所以这次的主题就是带领大家重新认识这些"不同寻常&quo ...

  8. Python内置类型——set

    Python中,内置类型set和frozenset用来表示集合,我们首先查看这两个类型支持的特殊对象,从而可以理解他们的特性. >>> dir(set) ['__and__', '_ ...

  9. 3、python内置类型(0529)

    python的内置对象类型以及支持的运算 python对象的相关术语 python程序中保存的所有数据都是围绕对象这个概念展开的 程序中存储的所有数据都是对象 每个对象都有一个身份.一个类型和一个值 ...

随机推荐

  1. 微信小程序记账本进度一

    一,1.注册微信公众号 2.点击“立即注册”后,点击“”小程序“” 3.填写邮箱等信息.完成并激活.

  2. C/S和B/S架构

    1.C/S架构(Client/Server结构,熟知的客户机和服务器结构),它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统 ...

  3. SD

    Offer(Tcode:VA23;Table: vbak and vbap) billing(Tcode:VF03;Table:vbrk and vbrp) Offer(quotation)-> ...

  4. Python爬虫项目--爬取链家热门城市新房

    本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确 ...

  5. node.js中express框架的基本使用

    express是一个基于node.js平台的,快速,开放,极简的web开发框架. 一.安装 express npm install express --save 二.简单使用 express //引入 ...

  6. python基础 (编码进阶,文件操作和深浅copy)

    1.编码的进阶 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码. 即先将其他编码的字符串解码(decode)成unicode,再从uni ...

  7. 安装配置python环境,并跑一个推荐系统的例子

    1.官网下载python2.7,安装完后,在环境变量Path中加上这个路径 在控制台输入python,出现版本信息,就成功了. 2.我使用的是 pycharm,注册后,在 把自己的python.exe ...

  8. 目录命令(cd)

    cd 命令: // 描述: (Change Directory) 更改当前目录或显示当前目录的名称. 如果仅使用驱动器号(例如,cd C :),则cd将显示指定驱动器中当前目录的名称. 如果不带参数使 ...

  9. Git的SSH-key生成、导入及使用

    Git主要使用4种协议传输数据:本地协议,SSH协议,Git协议和HTTP/S协议. SSH协议是最为常用的一种,正式介绍SSH之前,简要说明一下其它协议. 本地协议(file://) 本地协议的优点 ...

  10. 别人的Linux私房菜(23)软件安装RPM、SRPM、YUM

    RPM(RedHat Package Manager),不同Linux发行版发布的RPM文件甚至不同版本,不通用. SRPM为Source RPM,所提供的软件内容没有经过编译,格式为xxx.src. ...