数据类型 #################################### Python 程序中保存的所有数据都是围绕对象这个概念构建的,每个对象都有一个标识、一个类型(也叫作它的类)和一个值。例如,执行 ``>>> a = 42`` 时,就会创建一个值为 42 的整数对象,其中,对象的标识可以看作是指向它在内存中所处位置的指针,那么变量 a 就可以看做是这个对象的标识;类型就是整数类型;值就是 42。 对象的类型也称作对象的类,描述了对象的内部表示及它支持的方法与操作。创建特定类型的对象时,有时也将该对象称为该类型的实例。实例被创建之后,它的标识和类型就不可改变。如果某个对象包含对其他对象的引用,则将其称为容器(container)或集合(collection)。 变量 ************************************ Python 是一种动态类型的语言,在程序执行过程中,变量名会被绑定到不同的值,而且这些值可以属于不同的类型。赋值运算符 ``=`` 的作用仅仅是在名称和值之间创建一种关联。尽管每个值都有一个相关类型,如 integer 或 string,但变量名称是无类型的,在执行过程中可以引用任意类型的数据。 变量在赋值以后才会被创建。变量名只能包含字母、数字和下划线,而且不能以数字开头,变量名区分大小写,不能将 Python 定义的关键字用作变量名。例如: .. highlight:: none :: >>> counter = 100 # 整型变量 >>> miles = 1000.0 # 浮点型变量 >>> name = "runoob" # 字符串 >>> a = b = c = 1 # 多个变量赋值 >>> a, b, c = 1, 2, "runoob" # 多个变量同时赋值,也叫序列解包 标准数据类型 ************************************ Python 中大约有十几种内置数据类型,可用于表示程序中的大多数数据。对于表中“类型名称”列内所列出的名称或表达式,可以使用 ``isinstance()`` 和其他类型相关函数检查该类型。 +----------+------------+------------------------------+ |类型分类 |类型名称 |描述 | +==========+============+==============================+ |None |None |null 对象 | +----------+------------+------------------------------+ |数字 |int |整数 | | +------------+------------------------------+ | |float |浮点数 | | +------------+------------------------------+ | |complex |复数 | | +------------+------------------------------+ | |bool |布尔值(True 或 False) | +----------+------------+------------------------------+ |序列 |str |字符串 | | +------------+------------------------------+ | |list |列表 | | +------------+------------------------------+ | |tuple |元组 | | +------------+------------------------------+ | |range |创建的整数范围 | +----------+------------+------------------------------+ |映射 |dict |字典 | +----------+------------+------------------------------+ |集合 |set |可变集合 | | +------------+------------------------------+ | |frozenset |不可变集合 | +----------+------------+------------------------------+ None 类型 ==================================== None 类型表示一个 null 对象(没有值的对象)。Python 只提供了一个 null 对象,在程序中表示为 ``None`` 。如果一个函数没有显式地返回值,则会返回 None。在编写函数时 None 经常用作可选参数的默认值,以便检测调用者是否为该参数定义了值。None 没有任何属性,在布尔表达式中求值时为 False。 数字类型 ==================================== Python 使用 3 种数值类型:整数、浮点数以及复数。所有数值类型都是不可变的。除了布尔值之外,所有数字对象都有正负。 **整数** 具有无限的精度。因为在 Python3 中已经将整数和长整数两种类型统一为整数类型。 **布尔值** 只包括 ``True`` 和 ``False`` 两个值,分别映射为数值 1 和 0。布尔值属于整数的子类型。 .. note:: 在 Python3 中,True 和 False 可以运行所有的数字类型运算,并不会报错。 >>> True + False 1 >>> 9 + True 10 >>> 9 + False 9 **浮点数** 是用机器上浮点数的原生双精度(64 位)表示的。通常该精度符合 IEEE 754 的要求,提供大约 17 位数的精度和范围从 -308 到 308 的指数。Python 不支持 32 位的单精度浮点数。如果程序需要精确控制空间和数字精度,可以考虑使用 numpy 扩展库。 **复数** 使用一对浮点数表示,复数 z 的实部和虚部分别使用 z.real 和 z.imag 访问。方法 z.conjugate() 用于计算 z 的复共轭(a+bj 的共轭是 a-bj)。 数值类型拥有许多的属性和方法,旨在简化涉及混合算术的运算。为了更好地与有理数(在 fractions 模块中可以找到)兼容,整数使用了属性 x.numerator 和 x.denominator。为了兼容复数,整数或浮点数 y 拥有属性 y.real 和 y.imag,以及方法 y.conjugate()。使用 y.as_interger_ratio() 可将浮点数 y 转换为表示分数的一对整数。方法 y.is_integer() 用于测试浮点数 y 是否表示整数值。通过方法 y.hex() 和 y.fromhex() 可用低级二进制形式使用浮点数。 库模块中还定义了另外几种数值类型。decimal 模块支持更加泛化的十进制算术。fractions 模块增加了一个有理数类型。 字符串 ==================================== 在 Python 中处理文本数据是使用 str 对象,也称为字符串。 字符串是由 Unicode 码位构成的不可变 序列。 列表 ==================================== List(列表)是 Python 中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。 元组 ==================================== 元组(tuple)与列表类似,不同之处在于元组的元素不能修改。 集合 ==================================== 集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。基本功能是进行成员关系测试和删除重复元素。 字典 ==================================== 字典(dictionary)是 Python 中另一个常用的内置数据类型。 列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。 字典是一种映射类型,字典用 ``{}`` 标识,它是一个无序的键(key) : 值(value)对集合。 键(key)必须使用不可变类型。在同一个字典中,键(key)必须是唯一的。 Python 数据类型转换 ************************************ 有时需要对数据类型进行转换,才可以对数据进行相加、相乘或比较等操作。 以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。 ======================= ============== 函数 描述 ======================= ============== int(x [,base]) 将 x 转换为一个整数 float(x) 将 x 转换到一个浮点数 complex(real [,imag]) 创建一个复数 str(x) 将 x 转换为字符串 repr(x) 将 x 转换为表达式字符串 eval(str) 用来计算在字符串中的有效 Python 表达式,并返回一个对象 tuple(s) 将序列 s 转换为一个元组 list(s) 将序列 s 转换为一个列表 set(s) 转换为可变集合 dict(d) 创建一个字典。d 必须是一个序列 (key,value)元组。 frozenset(s) 转换为不可变集合 chr(x) 将一个整数转换为一个字符 ord(x) 将一个字符转换为它的整数值 hex(x) 将一个整数转换为一个十六进制字符串 oct(x) 将一个整数转换为一个八进制字符串 ======================= ============== 判断对象类型 ********************************* python 内建函数 isinstance() 用来判断对象是否是一个已知的类型,类似 type()。 .. note:: isinstance() 与 type() 区别: - type() 不会认为子类是一种父类类型,不考虑继承关系。 - isinstance() 会认为子类是一种父类类型,考虑继承关系。 如果要判断两个类型是否相同推荐使用 isinstance()。 以下是 isinstance() 方法的语法: :: isinstance(object, classinfo) - object -- 实例对象。 - classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。 如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。 实例 ==================================== :: >>>a = 2 >>> isinstance (a,int) True >>> isinstance (a,str) False >>> isinstance (a,(str,int,list)) # 是元组中的一个返回 True True