
2.3 数据类型
Python是一种动态类型语言,变量不需要提前声明而是在赋值时根据所赋的值自动确定类型,且变量类型随着所赋值类型的变动而变化。Python中变量名定义遵循以下规定。
(1)变量名由字母或者下画线开头的字母、下画线和数字组成,数字不能作为变量名的开头字符。例如,aa、a123、a5b、a_b、_abc、_a_b_c是合法变量名,而1a、aa#、a!b是非法变量名。
(2)系统关键字不能作为变量名使用。例如,int、True、print等系统关键字不能作为变量名使用。
(3)变量名中字母区分大小写。例如,aa、Aa、aA、AA代表四个不同的变量。

图2-2 Atom集成开发环境
(4)变量在内存中地址可通过函数id()获取,例如,id(aa)。
2.3.1 布尔型
布尔型是Python中最简单的数据类型,包括True和False两个值。比较和逻辑运算结果为布尔型值,条件成立,值为True;条件不成立,值为False。举例如下:

布尔型变量或者值可进行的运算可通过dir(bool)查看,常用的比较运算符如表2-1所示,逻辑运算符如表2-2所示。
表2-1 比较运算符

表2-2 逻辑运算符

2.3.2 整型
Python中的整型可以处理任意大小的整数,整型变量或者值可进行的运算可通过dir(int)查看,整数运算符如表2-3所示。
表2-3 整数运算符

其中,/运算的结果为浮点型,如:8/4=2.0, 6/4=1.5;%运算时,运算结果符号与模数符号一致且绝对值最小,如:7%4=3,-7%4=1, 7%-4=-1,-7%-4=-3;//运算时,被除数与除数符号一致时,结果为正,否则,结果为负,且运算结果向下取整,如,7//4=1,-7//4=-2, 7//-4=-2,-7//-4=1。
整数也可以表示成十六进制形式,如:0x4a、0xffff等。
2.3.3 浮点型
Python中的浮点型数可以表示成123.45和1.2345e2两种形式,浮点型变量值可进行的运算可通过dir(float)查看,常用运算符如表2-4所示。
表2-4 浮点型数运算符

2.3.4 复数型
Python中可以使用复数,复数分为实部与虚部,表示为(a+bj),使用complex(a, b)产生复数(a+bj),其中a表示实部,b表示虚部。复数可进行表2-4的运算,复数变量或者值可进行的运算可通过dir(complex)查看,常见的复数运算函数如表2-5所示。
表2-5 复数运算函数

Python中数值型数据,包括整型、浮点型和复数运算函数如表2-6所示。
表2-6 数值型数据运算函数

2.3.5 字符串型
Python中字符串是用英文半角单引号'或者双引号"括起来的字符序列,如:'abc#123%def'、"abc#123%def"。如果字符串中包括单引号字符,可以用双引号括起来,反之亦然,如:"abc'456"、'abc"456'。如果字符串中既有单引号,也有双引号,可以使用转义符表示,如:'123\'abc\"456'、"123\'abc\"456"。Python字符串转义符如表2-7所示。
表2-7 字符串转义符

若字符串前面为r或R,则字符串中字符不转义,如:r'123\n456\t'或r"123\n456\t",则表示字符串123\n456\t,其中\n与\t不转义。
如果使用三个单引号将字符串括起来,则可以自由地表示多行字符,且其中可以自由地使用单引号和双引号,如下所示。

字符串变量testStr中包括四行字符,其中的单引号和双引号无须转义。
表2-1所列的比较运算符可以判断两个字符串之间的关系,除此之外,字符串可进行的运算可通过dir(str)查看,常见运算如表2-8所示,子串操作如表2-9所示,转换与判断操作如表2-10所示。
表2-8 常见字符串运算

表2-9 字符串子串操作

表2-10 字符串转换与判断

计算机中存在多种字符集和编码方案,以表示不同范围的字符,使用不当会引起程序执行错误。常用的字符集和编码方案有UNICODE、ASCII、GB18030、GBK、BIG5等,其中,UNICODE最为常用,UTF-8、UTF-16、UTF-32是UNICODE的具体实现。Python 3默认使用UTF-8编码方案表示字符,如图2-2程序使用UTF-8编码。Python 3中也经常使用bytes,即以字节流形式存储字符串,有关字符编码常见操作如表2-11所示。
表2-11 Python 3字符编码操作

Python字符串可以使用类似C语言中的格式化符号,如表2-12所示。
表2-12 字符串格式化符号


2.3.6 列表型
Python中的列表是一对“[]”括起来的成员序列,成员之间以“,”隔开,成员在列表中的位置从0开始,成员可以是任意类型,例如,[]、[12, 45, 10]、['Hello', 123, True, 23.4]、[12, [1,2], False]等,其中[]是一个空列表,[12, 45, 10]是成员均为整数的列表,['Hello', 123, True, 23.4]是不同类型成员组成的列表,[12,[1, 2], False]中包括列表类型成员。列表操作可用dir(list)查看,常用操作如表2-13所示。
表2-13 列表操作

2.3.7 元组型
Python中的元组是一对“()”括起来的成员序列,成员之间以“,”隔开,成员在元组中位置从0开始,成员可以是任意类型。例如,()、(12, 45, 10)、('Hello', 123, True, 23.4)、(12,(1, 2), False)等,其中()是一个空元组,(12, 45, 10)是成员均为整数的元组,('Hello', 123, True, 23.4)是不同类型成员组成的元组,(12,(1, 2), False)中包括元组类型成员。元组中只有一个成员时,为消除歧义,在成员后跟一个逗号,例如,(1,)、('a',)等。元组与列表相似,但列表中元素可以修改,而元组中元素不能直接修改,元组操作可通过dir(tuple)查看,常用操作如表2-14所示。
表2-14 元组操作

元组中的成员为数值、布尔型值和字符串时,无法修改,但为类似于列表型的值时,可以修改,例如,tt=('a',[1], 'b'),执行tt[1].append(2),则tt的值为('a', [1, 2], 'b')。
2.3.8 字典型
Python中的字典是一对“{}”括起来的键/值对成员序列,成员之间以“,”隔开,键与值之间以“:”隔开。例如,{}、{'Zhao':1, 'Qian':2}、{1:[1, 2],2:(3, 4),3:'abc'}、{(1,):[1],(1, 2):[1, 2],(1, 2, 3):[1, 2, 3]}等,其中,{}是一个空字典;{'Zhao':1,'Qian':2}是键为字符串,值为整数的字典;{1:[1, 2],2:(3, 4),3:'abc'}是键为整数,值为列表、元组和字符串的字典;{(1,):[1],(1, 2):[1, 2],(1, 2, 3):[1, 2, 3]}是键为元组、值为列表的字典。字典的键可以是字符串、数值或者元组,不能为列表,因为列表值可变,不能计算hash值,hash值可以用函数hash()计算。例如,hash('abc')、hash(123)、hash(1.23)、hash((1+2j))、hash((1, 2, 3))等,hash([1, 2, 3])会抛出异常。
一个字典中,键应该是唯一的,若键重复,一般保留最后的键/值对,其余的自动丢失,例如,dc={'z':1,'z':2,'z':3},则dc={'z':3}。
在实际应用中,字典的键经常为字符串,值为任意类型,字典类型操作可通过dir(dict)查看,常用操作如表2-15所示。
表2-15 字典操作

2.3.9 日期型
日期型是与时间相关的类型,Python的time、datetime和calendar模块中包含了与日期型数据相关的操作。
1.time模块
time模块主要处理时间,在使用前需要通过“import time”引入time模块。time模块所包含的操作可通过dir(time)查看。time模块包含的struct_time元组如表2-16所示,时间格式化符号如表2-17所示,常用操作如表2-18所示。
表2-16 struct_time元组

表2-17 时间格式化符号

表2-18 time模块操作

2.datetime模块
time模块主要使用时间元组和距GMT1970纪元的秒数表示时间,与time模块不同,datetime模块表示时间的方式更加贴近人们平时的习惯,并且datetime模块包含了date、time、datetime、timedelta和tzinfo五个类,在引入模块时,语句为“from datetime import *”或者“from datetime import date, time, datetime, timedelta, tzinfo”,其中time类与time模块冲突,后引入的会使先引入的失效,可通过别名引入避免冲突,例如“import time as time0”或者“from datetime import time as dtime”。datetime模块所包含的操作可通过dir(date)、dir(time)、dir(datetime)、dir(timedelta)和dir(tzinfo)查看,别名引入时,需要使用别名,例如,dir(dtime)。
datetime模块date类主要与年月日组成的日期相关,常用操作如表2-19所示。
表2-19 datetime模块date类操作

datetime模块time类主要与时分秒组成的时间相关,常用操作如表2-20所示。
表2-20 datetime模块time类操作

datetime模块datetime类是date类与time类的组合,主要与年月日时分秒组成的时间相关,常用操作如表2-21所示。
表2-21 datetime模块datetime类操作


datetime模块的timedelta类主要用于表示两个时间之间的差值,具体为date类值之间或者datetime类值之间的差值,例如,td1=date(2017,7,1)-date(2016, 7, 1)和td2=datetime(2017, 7, 1, 14, 30, 10)-datetime(2016, 7, 1, 10, 10, 8)。
timedelta表示时间差值时,使用days、seconds、microseconds 3个属性值表示,常用操作如表2-22所示。
表2-22 datetime模块timedelta类操作

datetime模块的tzinfo类主要提供时区信息,但tzinfo是一个抽象类,不能直接使用,需要通过派生子类使用,实际应用中使用较少。
3.calendar模块
calendar模块主要处理日历,在使用前需要通过“import calendar”引入calendar模块,calendar模块所包含的操作可通过dir(calendar)查看。calendar模块分别用数字0~6表示星期一至星期天,常用操作如表2-23所示。
表2-23 calendar模块操作

2.3.10 数组型
Python中标准数据类型没有数组,列表可以当作一维数组使用,列表嵌套可以构成二维或者多维数组。
Python中要使用数组,可以通过语句“import array”引入模块array,模块array中提供基本的数组操作;或者安装第三方库NumPy,第三方库NumPy提供大量的数值运算,包括各种数组操作。本书介绍array中提供的数组操作,需要使用NumPy的读者可以通过安装NumPy包,进行各种数值运算和数组操作。
定义数组前需通过语句“import array”引入模块array,定义数组的格式为:xx=array.array(type[, value]),其中xx为数组名;type为数组元素类型;value可选,为数组的初始值,其中,数组中各元素的值必须为相同类型,数组长度可变,下标从0开始。
array中数组元素类型如表2-24所示。
表2-24 array数组元素类型

表2-24中array数组元素类型中没有普通的字符类型,普通的字符类型使用字符串实现。array数组定义举例如下。

array数组常用操作如表2-25所示。
表2-25 array数组常用操作
