2.1 数字类型

数字类型是最基础的类型,我们知道计算机最终是按0和1处理数据的,不过那是二进制的数据,为了方便人类,编程语言应该都是默认使用十进制数据的,所以经过一些处理之后,数字类型又可以细分为整型、浮点型、布尔型和复数。

2.1.1 整型

整型就是整数类型,在Python中用int表示。如果你想查看一个数据是什么类型,可以使用type()函数。int类型可以是正数、负数和0,比如25、-63、0都属于int类型。整数可以直接参与算术运算,在Python中分别用+、-、*、/这四个符号表示加、减、乘、除运算,而且支持使用小括号,与数学中的运算一样,小括号表示优先计算,代码如下:

res = 64 + 32
print(type(res), res)  # 输出:<class 'int'> 96
print(64 - 32)  # 输出:32
print(32 * 2)  # 输出:64
print((2 + 6) * 2)  # 输出:16
print(32 / 2)  # 输出:16.0

从32 / 2输出的结果可以看出,两个整数进行除法运算得到的结果不再是整数,而是小数类型,即浮点型。

2.1.2 浮点型

如果你是第一次听到“浮点”这个词,千万不要被它的高大上吓到了,其实浮点型就是小数,比如3.14、-6.66,之所以称为浮点型是因为小数用科学记数法表示时,小数点的位置是可以左右浮动的,例如635826可以表示为6.35826×105或63.5826×104,两者是等价的。由于计算机存储机制的问题,浮点数是有一定精度的,即浮点型的小数部分参与运算得到的结果可能会不准确,看一下例子就知道了。代码如下:

res = 3.6 - 3.1
print(type(res), res)  # 输出:<class ' float'> 0.5
print(1.1 - 1)  # 输出:<class ' float'> 0.10000000000000009
print(0.1 + 0.1 + 0.1)  # 输出:0.30000000000000004
print(1 / 3)  # 输出:0.3333333333333333

比如说1.1减去1应该等于0.1才对,但Python运算的结果却是0.10000000000000009,造成这种不准确的原因并不是Python的Bug,而是计算机的二进制机制只能尽可能接近某个小数,所以,整型运算的结果是准确的,但浮点型可能存在误差。如果我们需要准确计算小数,比如说金钱,一分钱也不能出错,我们可以使用Decimal这个类型,之后在类与对象的部分会讲到Decimal的用法。

2.1.3 布尔型

布尔即boolean,在Python中用bool表示,这种类型比较简单,只有True和False两个值,所以这种类型常用于表示是否、真假、对错,实际上True和False分别是数字1和0,所以布尔类型也属于数字类型。在写法上注意首字母要大写。现在关于布尔类型我不好举例,先记住它有True和False两个值,后面学到条件判断的时候布尔类型就可以闪亮登场了。代码如下:

is_ok = True
print(type(is_ok), is_ok)  # 输出:<class 'bool'> True
has_data = False
print(type(has_data), has_data)  # 输出:<class 'bool'> False

2.1.4 复数

Python中复数的概念与高中数学中的复数是一样的。什么?高中有学过复数吗?这里还是先来帮读者回忆一下吧,我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位(其中i2 = -1)。在Python中,复数表示为“实部+虚部j”,实部和虚部都是浮点型,并且虚部后面加上字母j,下面的代码定义了a、b两个复数:

a = 1 + 2j
b = 2.3 + 3.2j
print(type(a))  # 输出:<class 'complex'>
print(type(b))  # 输出:<class 'complex'>

我们可以从代码中看出,Python的复数是complex类型,这种类型提供了访问实部、虚部以及对应的共轭复数的属性,但一般我们不用单独对实部或虚部进行计算,因为Python的复数本来就支持算术运算,代码如下:

print("实部:", a.real)  # 输出:实部: 1.0
print("虚部:", a.imag)  # 输出:虚部: 2.0
print("共轭复数:", a.conjugate())  # 输出:共轭复数: (1-2j)
print(a + b)  # 输出:(3.3+5.2j)
print(a - b)  # 输出:(-1.2999999999999998-1.2000000000000002j)
print(a * b)  # 输出:(-4.1000000000000005+7.8j)
print(a / b)  # 输出:(0.5602060528010303+0.09014810045074047j)

特别提醒,复数一般用于科学计算,因为本书的内容不会涉及复数的使用,所以如果读者确实搞不懂复数也没关系,直接愉快地跳过吧,接下来要讲的字符串是一个重点。