你真的了解Python里的True和False吗?

Nov. 3, 2017, 11:56 p.m.

对象都可以用于做真假判断 --(在Python中一切皆对象)

【False(假)】

只有以下对象

  1. None
  2. 零值 a. 0(整数) b. 0.0(浮点数) c. 0j(虚数)
  3. 空序列 a. 空字符串 b. 空列表 c. 空元组 d. 空字典

举例:

# 1.None 2.零值 3.空序列
# 判断结果:True
if not (None and 0 and 0.0 and 0j and '' and [] and () and {}):
    pass
  • 判断结果为True时if代码块里的语句才会执行

【True(真)】

除了False的情况

举例: 1. 整数,浮点数,非空序列

# 负整数,正整数,负浮点数,正浮点数,非空字符串,非空列表,非空元组,非空字典
# 判断结果:True
if -1 and 1 and -1.1 and 1.1 and 'hello' and [1, ] and (1, ) and {'city' : 'haikou'}:
    pass
  1. 实例化一个对象
class City(object):
    def __init__(self):
        pass

# 阅读提示:类名City首字母为大写,对象city为全小写
city = City() 

# 判断结果:True
if city: # 对象只要被创建了就为真
    pass

# 根据一切皆对象的原理,故类City也是对象,也可用于真假判断
# 判断结果:True
if City: # 类只要被定义了就为真
    pass
  • 判断结果为True时if代码块里的语句才会执行

【帮助你转换到Python的思维里】

  • 程序语言和自然语言之间的映射: 真 -> 非空 假 -> 空

举例: 1. 列表对象

cities = ['shenzhen', 'haikou', ]

# 程序语言:如果cities列表对象 是假的
# 自然语言:如果cities列表对象 的值为空
# 判断结果:False
if not cities: 
    pass

# 程序语言:如果cities列表对象 是真的
# 自然语言:如果cities列表对象 的值为非空
# 判断结果:True
if cities:
    pass

以下是普通写法,和上面相对应的语句作用相同 但不推荐使用,因为不够Pythonic

# 判断结果:False
if cities == []: 
    pass
# 判断结果:True
if len(cities) > 0: 
    pass
  • 拆解分析: a. 比较if not cities:和if cities == []: b. 分别除去 if、cities以及: c. 则not等同于==[] d. not的意思为“是假的” e. ==[]的意思为“等于空列表”

  • 整数

# 程序语言:如果0对象 是假的
# 自然语言:如果0对象 的值为0
# 判断结果:True
if not 0:
    pass

# 程序语言:如果-1对象 是假的
# 自然语言:如果-1对象 的值为0
# 判断结果:False
if not -1:
    pass

# 程序语言:如果-1对象 是真的
# 自然语言:如果-1对象 的值不为0
# 判断结果:True
if -1:
    pass
  • 拆解分析: a. not 0的意思是:0对象是假的(是一个句子,这个句子作为if语句的判断内容) b. 0的意思是:值为0的对象(是一个名词,存在于句子中) c. if语句判断的内容只能输出真或假
  • 问题: 为什么说 [ 0对象是假的 ] 这句话的判断结果是True? 因为0对象这个名词的性质是假的(前面定义了假的包含了哪几类对象) 我说它是假的这句话当然就是真的了 只有这句话是真的 if代码块里的语句才会执行

【总结】

  1. 两个维度 来看 a. 一个是对象本身 b. 另一个是if语句的内容* 它们都会有一个关于真假的描述或结果

  2. 如果你在if语句的判断内容中没有看到not 则表示“是真的”

  3. 在读代码或写代码的时候 尝试着用自然语言读出来 在这之前 你需要事先在大脑里 建立起自然语言和程序语言之间的映射

True和False可以做数学运算

  1. 我们先在Python Shell里开始尝试一下吧(在终端中输入python,然后按下reutrn就可以进入)
# 命令提示符为三个大于号(即“>>>”)的表示Python Shell中输入的代码
>>> True + 2
3
>>> True - 2
-1
>>> True * 2
2
>>> True / 2
0

True与整数进行加减乘除运算的结果竟然也是整数

  1. 很明显True的值就是1,把True换成1后,其结果是一模一样的
>>> 1 + 2
3
>>> 1 - 2
-1
>>> 1 * 2
2
>>> 1 / 2
0
  1. 可以先初步猜测True在Python中是int类型,用内置函数type()看看
>>> type(True)
<type 'bool'>

是bool类型,很正常,完成没问题啊 也就是说bool类型可以做数学运算 这么说没道理啊 既然这是事实 那bool类型和int类型肯定有关系 4. 用内置的isinstance来看看True是不是int类型

>>> isinstance(True, int)
True

证据出现了 True是int类型 这就不难理解为什么True和False可以用于数据运算了 除此之外 我们还得出在Python中 bool类型是int类型的派生类(也称为子类)

  1. 结论:True -> bool类型 -> int类型

True和False在Python对象里的映射关系

  1. True和False映射到什么 True唯一映射到 整数1 False唯一映射到 整数0

  2. 什么映射到True和False [ None、零值、空序列 ] 映射到 False 除了[ None、零值、空序列 ] 的对象 映射到 True

None 是什么

  1. None 是一个特殊的常量 None 的类型是NoneType,通过print type(None)可以得知 None 是 NoneType 数据类型的唯一值 无法创建出第二个 None 遵循单例模式

  2. 可以将 None 复制给多个不同的变量 不同的变量,其 id 都是一样的

  3. None 不是零值 不是空序列 不是 False

  4. None 和任何其它的数据类型进行 and 逻辑操作永远都返回 False

运行环境

  • Python:2.7.10
  • TextMate:2.0-rc.10
  • 个人计算机:iMac
  • 操作系统:macOS
  • 处理器:2.9GHz 四核 Intel Core i5
  • 内存:8GB 1600MHz DDR3

返回首页