2.4 数字
本节重点讲解Python中与数字相关的类型,其他内置类型将在后续各章中专题讲解。
2.4.1 认识数字
Python包含3种不同类型的数字:整数(int)、浮点数(float)和复数(complex)。另外,布尔值(bool)属于整数的子类型。
创建数字有两种方法,简单说明如下。
(1)数字字面值,具体可分为以下3类。
➢ 不带修饰的整数字面值会生成整数,包括十进制、十六进制、八进制和二进制数。
➢ 包含小数点或幂运算符的数字字面值会生成浮点数。
➢ 在数字字面值末尾加上'j'或'J'生成虚数,也就是实部为零的复数。将其与整数或浮点数相加生成具有实部和虚部的复数。
(2)调用内置函数。
Python支持数字的混合运算。当一个二元算术运算符的操作数有不同类型的数值时,位数"较窄"类型的数值会被转换为另一个操作数的类型,如整数转换为浮点数,浮点数转换为复数等。除了复数外,所有数字类型都支持表2.1所示的运算。
注意:数字字面值有3种类型:整型数、浮点数和虚数。没有复数字面值,复数由"实数+虚数"合成。数字字面值并不包含正负号,如-1实际上是由一元运算符-和字面值1合成的。
表2.1 所有数字类型都支持的运算
2.4.2 整数
整数(int)字面值有4种类型,具体如下。
(1)十进制整数,不能以0开头,中间可以包含"_"符号,表示对数字进行分组。
(2)二进制整数,由0和1组成,逢二进一,以0b或0B开头的数字。中间可以包含"_"符号,表示对数字进行分组。例如:
n = 0b101 # 二进制数字 print(n) # 输出十进制数字 5
(3)八进制整数,由0~7组成,逢八进一,以0o或0O开头的数字。中间可以包含"_"符号,表示对数字进行分组。例如:
n = 0o23 # 八进制数字 print(n) # 输出十进制数字 19
(4)十六进制整数,由0~9和a~f组成,逢十六进一,以0x或0X开头的数字。中间可以包含"_"符号,表示对数字进行分组。例如:
n = 0x23 # 十六进制数字 print(n) # 输出十进制数字 35
整数包括正整数、0和负整数。整数最大值仅与系统位数有关,简单说明如下。
➢ 32位:maxInt == 2**(32-1)-1。
➢ 64位:maxInt == 2**(64-1)-1。
【示例】可以通过sys.maxsize查看系统最大整数值。
import sys # 导入sys系统模块 print(sys.maxsize) # 输出 9223372036854775807 print(2**(32-1)-1) # 输出 2147483647 print(2**(64-1)-1) # 输出9223372036854775807
2.4.3 布尔值
布尔值(bool)是整数的子类,它仅包含两个常量对象:False和True,分别表示逻辑上的假和真。不过其他值也可被当作假值或真值使用。
例如,当参与布尔运算时,下面内置对象将被解释为False,也称为假值。
➢ 假值常量:None和False。
➢ 任何数值类型的零:0、0.0、0j、Decimal(0)、Fraction(0, 1)。
➢ 空的序列和多项集:''、""、''''''、""""""、()、[]、{}、set()、range(0)。
产生布尔值结果的运算和内置函数总是返回0或False作为假值,1或True作为真值,除了假值外,其他的值都被解释为真值,有关假值和真值的更详细说明参见2.5.3节。
提示:虽然[]和()都是假值,但是它们并不相等。对于其他不同类型的假值也是如此。
注意:在布尔运算中,不需要显式转换值的类型,Python自动转换为布尔值。
在数字运算中,False和True的行为分别类似于整数0和1。
使用内置函数bool()可以将任意值转换为布尔值,只要该值可被解析为布尔值。
2.4.4 浮点数
浮点数(float)通常使用C语言的double来实现。浮点数字面值有如下两种类型。
(1)点数浮点,常称之为小数,包括3种形式:"整型数部分。整型数部分"".整型数部分""整型数部分."。
(2)指数浮点,包括2种形式:整型数部分+指数部分、点数浮点+指数部分。
整型数部分和指数部分在解析时都是以10为基数,即十进制数字,具体说明如下。
➢ 整型数部分:是以数字开头,中间允许包含下画线(_)组成的整数,如123、1_2等。下画线主要功能是对数字进行分组。
➢ 指数部分:是由字母e或E开头,然后跟随+或-符号,后面是整型数部分,如e+12、e-1_2等。
例如,下面定义4个小数浮点。
3.14 # 标准浮点数 3.14_15_93 # 分组小数,等效于3.141593 10. # 整数式小数,等效于10 .001 # 纯小数,等效于0.001
指数浮点也称为科学计数法。例如:
0e0 # 等效于0.0 2.5e2 # 等效于2.5×102 = 250 2.5e-2 # 等效于2.5×10-2 = 0.025
其中e(或E)表示底数,其值为10,而e(或E)后面跟随的是10的指数。指数是一个整型数,可以取正负值。
提示:程序运行所在机器上浮点数的精度和内部表示法可以在sys.float_info中查看。例如,使用sys.float_info.max可以查看本地系统支持最大浮点数。
import sys # 导入sys系统模块 print(sys.float_info.max) # 输出 1.7976931348623157e+308
在浮点数运算中,出现精度丢失现象,因此,不建议使用浮点数进行高精度计算。例如:
print(0.2+0.4) # 输出 0.6000000000000001
2.4.5 复数
复数(complex)是对普通实数系统的扩展,它表示一个实部和一个虚部的和,虚部带有一个j后缀,可以使用a + bj表示,复数的实部a和虚部b都是浮点型。
如果要从一个复数z中提取实部和虚部,可使用z.real和z.imag。复数相关的操作函数与cmath模块相似。
复数之间的运算是实部与实部相运算,虚部与虚部相运算,然后求实部和虚部的和。例如:
a = 1.56+1.2j b = 1 - 1j print(a.real) # 输出实部 1.56 print(a.imag) # 输出虚部 1.2 print(a-b) # 实部相减,虚部相减,输出 0.56+2.2j