Python从入门到精通(微课精编版)
上QQ阅读APP看书,第一时间看更新

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