1.2.3 数据类型

计算机内部的所有数据都可以看作对象,变量在程序中起到指向数据对象的作用,变量赋值其实是把数据对象和变量关联起来的过程。Python中的常用数据类型有number、str、list、tuple、dict和set 6种,其中,number和str属于基础数据类型,list、tuple、dict和set属于复合数据类型。

1.基础数据类型

(1)number

number又称为数值型,是专门用于存储数值的数据类型,具有不可改变性。Python支持4种不同的数值数据类型,如表1-13所示。

表1-13 Python支持的数值数据类型

给变量指定一个数值时,number对象就被创建,并在内存中分配了存储空间。通过type函数可以判断number对象的类型。不同number类型通过函数可以互相转换,使用代表number类型的函数即可。也可以进行混合运算,运算时先自动转换成同一类型,再进行运算,转换遵守一定的方向:int向float转换,非complex向complex转换。

(2)str

str又称为字符串,是存放着Unicode字符序列,用于表示文本的数据类型。str可以由任何字符构成,包括字母、数值、符号或标点符号及其任意组合,如“Hello,word!”“1+1”等。

创建一个str时,除字符外,还要在字符序列的首尾加上引号。使用单引号(')、双引号('')是等效的,但需要保证str两端的引号类型相同。如果要指定一个多行的str,则需要使用三引号(''')。

str支持索引,索引一般写为“变量[下标]”和“变量[头下标:尾下标]”两种格式。“变量[下标]”格式能够索引单个字符,“变量[头下标:尾下标]”格式能够进行切片(索引连续的多个元素)。

除一般的索引格式外,str还支持按步长索引,即指定步长后,每隔固定的步数索引一次字符,其格式为“变量[头下标:尾下标:步长]”;此外,通过“变量[::−1]”索引式可以将整个str反向排序。

Python为str提供了极为丰富的方法,使str具备了极佳的可操作性。str方法中的一部分是用于查询的,str查询方法如表1-14所示。

表1-14 str查询方法

有的str方法提供了改写功能,str改写方法如表1-15所示。

表1-15 str改写方法

有的str方法提供了除查询与改写功能外的其他功能,str其他方法如表1-16所示。

表1-16 str其他方法

Python的str和其他语言的相同,也有转义字符,Python中的转义字符如表1-17所示。

表1-17 Python中的转义字符

另外,可以使用“+”和“*”分别实现str的连接和重复操作。

2.复合数据类型

计算机语言中的容器是指根据某种方式组合数据元素形成的数据元素集合,即数据类型。可以存放多种类型元素的容器被称为复合数据类型。Python中的容器包含序列、映射和集合,几乎所有Python容器都可以归结为这3类。

Python中的序列包括str、list、tuple、Unicode字符串及buffer对象等,其中,str、list、tuple最为常用。Python中唯一的映射类型是dict,dict中的每个元素都存在相应的名称(称为键)与之一一对应。Python中的集合概念相当于数学中的集合。集合类型包括set(可变集合)与frozenset(不可变集合)。

(1)list

list又称为列表,属于序列类数据,是包含0个或多个对象引用的有序序列。list中的所有数据项都是对象引用,因此list可以存放任意数据类型的数据项,既可以是int、float、str等基础数据类型,又可以是list、tuple、dict等高级数据类型。list是Python中最通用的复合数据类型。

list可以用方括号[ ]创建,空的方括号创建空的list,包含多个项的list可以在方括号中使用逗号分隔的项序列创建;也可以通过list函数创建,list函数最多接收一个参数,不带参数调用函数时返回空list,带参数时返回参数的浅复制(在有指针的情况下,浅复制只是增加了一个指针指向已经存在的内存);对复杂参数(非基本元素,如高级变量)则尝试将给出的对象转换为list。索引、连接及重复是灵活运用list这一数据类型的基础操作,list的这3种操作的操作方式和str的对应操作类似。

Python为list提供了一些常用的内置方法,可以实现list的查询、增删和排序等功能。list的常用方法如表1-18所示。

表1-18 list的常用方法

(2)tuple

tuple又称为元组,与list同属于序列类数据,是包含0个或多个对象引用的有序序列。与list不同的是,tuple是不可更改的数据类型。

tuple可以用圆括号()创建,空的圆括号创建空的tuple;包含一个或多个项的tuple可以使用逗号分隔元素;如果tuple内只包含一个元素,则需要在元素后加上逗号予以区分。有时,tuple必须被包含在圆括号中,以避免语义二义性。例如,要将tuple(1,2,3)传递给一个函数,应该写成function((1,2,3))的形式,以免被识别成传递“1,2,3”这3个数字变量。

tuple支持索引,其索引方式与str、list类似;与list相同的是,tuple可以进行连接、重复操作;与list不同的是,tuple中的元素无法做增删操作,只能使用del函数删除整个tuple。

Python为tuple提供的内置方法较少,主要用于查询。tuple的内置方法如表1-19所示。

表1-19 tuple的内置方法

(3)dict

dict又称为字典,属于映射类数据。dict通过键而不是位置来索引。键是不可变对象(如number、str、tuple)的对象引用,值是可以指向任意类型对象的对象引用。dict是Python中唯一一种映射数据类型,具有可变性,dict的长度可以增大或减小,同list一样。dict的值可以无限制地取任何Python对象,既可以是Python内置的标准数据,又可以是用户自定义的。同一个键不允许出现两次,创建dict时,如果同一个键被赋值两次,则只有后一个值会被记住。键固定不变,所以只能用number、str或tuple充当。注意,可变的数据类型不能充当dict中的键。

dict可以用花括号{}创建,空的花括号创建空的dict;非空的花括号包含一个或多个逗号分隔的项,每个项包含一个键、一个冒号及一个值。通过dict函数也可以创建dict,不带参数时返回一个空的dict;带一个映射类型参数时,返回以该参数为基础的dict,当参数本身为dict时,返回该参数的浅复制。也可以使用序列型参数,前提是序列中的每个项是包含两个对象的序列,第一个作为键,第二个作为值。

dict的主要索引方式是通过键索引值,这与str等变量截然不同。通过dict的索引功能,可以实现dict的查、改、增、删,且不需要用到Python提供的内置方法。Python为dict提供了丰富的内置方法,通过内置方法也可以实现查询、增删和创建。dict常用的内置方法如表1-20所示。

表1-20 dict常用的内置方法

(4)set

Python中有两种内置集合类型—set和frozenset。set是引用0个或多个对象的无序组合,所引用的对象都是不可变的,所有内置的固定数据类型(如float、frozenset、int、str、tuple)都是不可变的。本书以下所指的集合都是set。

set可以使用{}或set函数创建。使用{}创建集合时,使用{}包裹一个或多个项,项与项间用“,”分割;空的set无法用{}创建。使用set函数创建set时,不带参数时,返回空set;带一个参数时,返回参数的浅复制;带多个参数时,尝试将给定的对象转换为set。

set是可变的,但由于其中的项是无序的,因此没有索引的概念。set可变而无法索引,这使得它无法进行查询和修改元素的操作,但仍支持元素的增删,并可以实现清空和复制操作。set的常用操作基本上都需要通过内置方法实现。set常用的内置方法如表1-21所示。

表1-21 set常用的内置方法

set起源于数学,与数学集合相似,Python中的set也有子集、并集、交集、差集和对称差集等概念,并能进行集合运算,其说明和操作如表1-22所示。

表1-22 set集合运算的说明和操作