类型为什么重要
“类型”就是一个类别,它告诉 Python 一个值应该怎样表现。两个整数相加是做算术;两个字符串相加是把它们拼接起来;把字符串和整数相加则会报错。一个值的类型决定了对它进行哪些操作才有意义。
Python 的内置类型不多,而且很友好。其中四种,int、float、str、bool,你写的几乎每个程序都会用到。其余的类型会在你开始把数据组织成集合时出现。
数字:int 和 float
数字有两种,Python 根据你的写法决定给你哪一种:
没有小数点?得到的是 int。有小数点?得到的是 float。在算术运算中可以随意混用它们,任何涉及 float 的运算结果都是 float:
Python 中的整数可以大到你的内存所能容纳的程度:不会溢出,也没有固定的 32 位或 64 位上限。你可以计算 2 ** 1000,Python 会把每一位数字都给你算出来。
浮点数遵循通常的 IEEE 754 规则,这意味着会有几个经典的意外:
它打印的是 0.30000000000000004,而不是 0.3。这不是 Python 的 bug,所有语言中的二进制浮点数都是这样工作的。当你需要精确的小数时(比如处理金额),请改用 decimal 模块。其他情况下,在显示时四舍五入通常就够了。
字符串:str
字符串是字符的序列。用单引号或双引号把它括起来,Python 不在乎用哪种,只要开头和结尾的引号一致就行:
三引号字符串(""" ... """)可以跨越多行:
字符串有一大套 API,你会慢慢学会:切片、.upper()、.split()、.replace() 这样的方法,以及能写出 f"Hello, {name}" 的 f-string 格式化。下一页就专门讲字符串。
布尔值:bool
只有两个值,必须完全按照这样拼写:True 和 False,首字母大写。比较运算的结果是布尔值:
在底层,True 和 False 实际上就是 1 和 0,所以如果你需要统计有多少个条件为真,可以直接对布尔值求和:
None:没有值
None 是 Python 表示“没有值”的方式。没有显式返回任何东西的函数会返回 None。你也会把它用作占位符:
约定是用 is None 和 is not None 来判断,而不是 == None。is 检查的是同一性,这才是你在这里真正想表达的意思。
列表、元组、集合、字典
这是四种内置的集合类型。每一种都有专门的页面详细讲解,这里先简单介绍一下,让你能认出它们:
经验法则:
- 列表:你预计会变化的序列。添加、删除、排序都没问题。
- 元组:你想保护起来不被修改的序列。常用于形状固定的记录,比如
(x, y)坐标。 - 集合:一袋不重复的元素,适合出现重复就算 bug 的场景。
- 字典:按键查找。也就是 JSON 那种结构。
类型之间的转换
当自动转换有风险时,Python 不会替你转换类型。把整数变成字符串,或者把字符串变成数字,都需要你主动要求:
如果某个转换没有意义,比如 int("hello"),Python 会抛出 ValueError,并告诉你传给它的是什么。报错,看明白,改好,继续。
检查类型
有两个工具值得了解:
type() 很适合在 REPL 里快速看一眼。在实际代码中用的是 isinstance(),因为它能很好地配合继承,还能同时检查多种类型。
一个快速的小练习
先原样运行下面的代码块,然后改几个值,看看类型会变成什么:
你现在还不需要理解 for,我们后面会讲到,但这能让你一眼就对这些内置类型有个整体印象。
选择适合数据的类型
你现在不需要记住每一种类型。但你确实需要在看到某种类型时能认出它,在创建数据时能选对类型。“它是固定的还是会变的?元素是否唯一?我是按键查找还是按位置查找?”九成的情况下,这几个问题就能帮你选出合适的集合类型。
下一篇:深入讲解字符串,因为它是你几乎每个程序都会接触到的数据类型。
常见问题
Python 主要有哪些数据类型?
数字(int 和 float)、字符串(str)、布尔值(bool)、None,以及四种集合类型:list、tuple、set 和 dict。你在 Python 代码中见到的其他一切,都是由这些类型加上少数几个其他类型(bytes、complex、frozenset)构建而成的。
在 Python 中怎么查看一个值的类型?
把它放进 type():type(42) 返回 <class 'int'>,type('hi') 返回 <class 'str'>。要做真假判断,就用 isinstance(value, int),它更灵活,因为它也能处理子类。
Python 是静态类型还是动态类型?
动态类型。一个变量可以指向任何类型的值,同一个变量在它的生命周期内也可以改变类型。这和 Java 或 C++ 这类语言不同,在那些语言中,你声明一次变量的类型,之后就不能再改。