数字类型基础——数字字面量
在 Python 的基本类型中,它提供了整数,它们是正负整数,还有浮点数,它们是带小数部分的数(有时简称为 “floats”)。Python 还允许用十六进制、八进制和二进制字面量来表示整数;还提供了复数类型;还允许整数拥有无限精度 —— 只要内存空间允许,就可以增长到尽可能多的位数。表 5-1 显示了 Python 的数字类型在程序中作为字面量或构造器函数调用时的写出来的样子。
通常,Python 的数字类型字面量写起来是很简单的,但有几个编程概念值得在这里强调:
整数和浮点字面量#
整数被写作十进制数字的字符串。浮点数有一个小数点和 / 或一个可选的有正 / 负符号的指数,该指数前面是一个 e
或 E
跟着一个可选的正 / 负符号。如果写一个带小数点或指数的数字,当这个对象用在表达式中时,Python 会让它成为一个浮点对象并使用浮点(非整数)数学。在标准 CPython 中,浮点数被实现为 C 的 “doubles” 类型,并因此获得了 C 编译器(用来构建 Python 解释器)给到 doubles 类型的那么高的精度。
Python 2 系列中的整数:普通整数和长整数#
在 Python 2 系列中有两个整数类型,普通整数(通常是 32 位)和长整数(无限制精度),而且一个整数可能以一个 l
或 L
结尾来强制它成为长整数。因为当整数的值在溢出分配位数时会被自动转为长整数,所以永远不需要亲自输入字母 L
—— 当需要额外精度时,Python 自动将其转为长整数。
Python 3 系列中的整数:唯一的类型#
在 Python 3 系列中,普通整数和长整数合并了 —— 只有整数,它自动支持 Python 2 系列中独立长整数的无限精度。因此,整数不再以一个结尾的 l
或 L
来编码,且整数也永远不会用这个字符来打印。除此之外,大多数程序并不会被这个改变影响,除非它们确实进行了类型测试来检查 2 系列中的长整数。
十六进制、八进制和二进制字面量#
整数可以用十进制(以 10 为基数)、十六进制(以 16 为基数)、八进制(以 8 为基数)或二进制(以 2 为基数),最后三个在某些编程领域中很常见。十六进制数在最前面有一个前导的 0x 或 0X,接着是一个十六进制数字(0-9 和 A-F)的字符串。十六进制数字可用小写或大写字母编码。八进制字面量是以一个前导 0o 或 0O(零和小写或大写字母 O)开始,跟着一个数字(0-7)字符串。在 2 系列中,八进制字面量还可以只用一个前导 0 来编码,但在 3 系列中不行 —— 这种原始的八进制形式很容易和十进制混淆,因此被新的 0o 格式(还可以用于从 2.6 开始的 2 系列中)所代替。在从 2.6 和 3.0 开始的新版本中,二进制字面量是以一个前导的 0b 或 0B 开头,跟着二进制数字(0-1)。
注意所有这些字面量都会生成编码中的整数对象;它们仅仅是指定值的可选语法。内置调用 hex(I)
, oct(I)
和 bin(I)
将整数转换为这三种基数的字符串表示形式,而 int(str,base)
将运行时字符串转换为指定基数的整数。
复数#
Python 复数字面量被写作 实部
+ 虚部
,虚部
以 j
或 J
结尾。技术上实部
是可选的,所以虚部
可能单独出现。虽然复数在内部被实现为浮点数对,但当数字运算应用到复数时,都执行复数运算(译注:实部与虚部分开计算)。复数还可以用 complex(real, imag)
这个内置调用来创建。
对其他数字类型进行编码#
本章后面将看到:在表 5-1 末尾的额外数字类型有更高级或专业的用途。通过调用导入模块中的函数来创建某些数字类型(比如高进度十进制数和分数),其它的有自己的字面量语法(如 sets)。