数值类型
一、 数据类型
在现实中,我们会根据事物的不同表现,进而可以进行相应的分类。例如,当我们去超市购物时,超市会根据商品的不同特征分类:食品类,日常用品类,家用电器类……在我们学数学时,也可以对数值进行分类:整数,小数,分数,复数……。同样,在Python中,我们也可以根据数据的不同特征,对数值进行不同的分类。
1.1 数据得类型
在Python中,数据可以分为如下类型:
数值类型
- 整数类型(int)
- 浮点类型(float)
- 复数类型(complex)
布尔类型(bool)
序列类型
- 列表(list)
- 元组(tuple)
- 字符串(str)
- 字节(bytes)
映射类型(dict)
集合类型(set)
其他内置类型
本章中,我们只讨论数值类型与布尔类型,其他类型,我们会在后续章节中进行详细说明。
鸭子类型
在Python中,严格来说,变量是不具有类型的,变量的类型完全取决于其所关联的对象类型,这与其他语言的差别较大(C,Java等)。因此,我们常习惯的成Python的类型为“鸭子类型”,这是一种动态类型的体现。
说明:
由于变量必须要关联一个具体的对象,才能确定变量的类型。因此,在定义变量时,不能只给出变量的名字,必须要同时也给出变量所关联的对象。
Python2中还支持长整数类型(long),在Python3中取消。
1.2 整数类型
整数类型(int)是最常使用的类型。我们数学上使用的整数,例如,3,-50等,这些都是整数类型。
四种进制表示
整数类型支持四种进制表示:
- 二进制(使用0b或0B前缀)
- 八进制(使用0o或0O前缀)
- 十进制(无前缀)
- 十六进制(使用0x或0X前缀,10 ~ 15使用a ~ f或A ~ F表示)
进制转换
我们可以调用相应的函数,来对四种进制之间进行转换。
- bin其他进制转换为二进制
- oct其他进制转换为八进制
- int其他进制转换为十进制
- hex其他进制转换为十六进制
1.3 布尔类型(真假判断)
布尔类型(bool)表示的是一种条件的判断,具有两个值:True与False。其中,True表示条件成立,即为“真”,而False表示条件不成立,即为“假”。
布尔类型是整数类型的子类型。实际上,True就是1,False就是0。因而,我们也可以使用布尔类型参与数学上的运算,与使用1与0参与运算的结果是一样的。
1.4 浮点类型
浮点类型(float)就是数学上的小数类型。例如:1.0,-2.5等,都是浮点类型。在进制表示上,浮点类型仅支持十进制表示(这点不同于整数类型)。除了常规的表示方式外,浮点类型也可以使用数学上科学计数法的形式表示,例如:
1.5e30
说明:
- 十进制的整数类型不能使用0开头,但是,浮点类型可以以0开头。
浮点类型的特殊值
浮点类型具有两个特殊值:NaN(Not A Number)与Infinity(无穷大),其中无穷大又可分为正无穷(+Infinity)与负无穷(-Infinity)。我们可以通过float函数来获得这些值。
NaN有一个特征,就是自己不等于自己,因此,我们不能通过==来判断一个数值是不是NaN。
浮点类型的不精确性
在使用浮点类型时,我们需要留意,浮点类型在计算机中仅是近似的存储,浮点类型是不精确的。因此,我们要避免进行如下的操作:
- 避免数量级相差很大的浮点值之间进行运算。
- 避免进行等量的比较。
练习浮点类型的计算,自行找出还有哪些计算体现出不精确性。
Decimal的使用
考虑到浮点类型的不精确性,因此,如果我们需要进行精确计算时,我们可以使用decimal模块中的Decimal类来实现,该类提供精确的浮点计算。
此外,我们也可以指定Decimal的计算精度,即计算结果最多保留的有效数字位数,默认为28位有效数字。
1.5 复数类型
Python中的复数类型(complex)类似于数学上的复数。含有虚部(使用j或J后缀)的数值为复数类型。例如:3 + 5j,-2 - 3j(数学中虚部后缀为i)。复数分为实部与虚部两个部分,我们可以通过real与imag属性分别获取复数的实部与虚部的值。
1.6 类型转换
获取数据类型
我们可以通过type函数获取变量的类型,准确的讲,应该是变量所关联的对象的类型。
使用int,float与complex进行混合运算,确定结果的类型,总结。
类型转换函数
我们可以在不同的类型之间进行类型转换,Python中为我们提供了如下的转换函数:
-
int(value)
将数值类型或字符串转换为整数(int)类型。如果没有参数,返回0。 -
float(value)
将数值类型或字符串转换为浮点(float)类型。如果没有参数,返回0.0。 -
complex(real, imag)
根据实部与虚部(可选)创建一个复数。如果没有参数,返回0j。 -
bool(value)
参数为真值时,返回True,否则返回False。
4种类型之间的转换
说明:
尽管可以使用转换函数进行类型转换,但并非任意两个类型之间都是能够进行转换的。例如,复数类型就不能够通过int或float转换为整数或浮点类型。
此外,int函数还可以提供第二个参数,指定解析转换时,使用的进制。此时,第一个参数需要是字符串类型(或字节等类型),不能是数值类型。例如:
int(“300”, 16)
则会根据16进制来解析300,最终函数返回的结果为768,而不是300。如果没有指定第二个参数,则默认为十进制。
级别:复数类型> 浮点类型> 整型 > 布尔类型