数据类型


# 数据类型

在 Python 中,数据类型分内置的和自定义的。内置的共有 8 种常用的以及一些不太常用的数据类型;而自定义的一般以类的形式,根据需要组合内置类型成为独特的数据类型。

8 种常用内置数据类型:

  • 数字
  • 布尔
  • 列表
  • 元组
  • 字符串
  • 字典
  • bytes
  • 集合set

# 数字

Python 支持三种不同的数字类型,整数、浮点数和复数:

# 整数(Int)

通常被称为整型,是正或负整数,不带小数点。Python3 的整型可以当作 Long 类型(更长的整型)使用,所以 Python3 没有 Python2 的 Long 类型。

  • 十进制表示法:1,100,-8080,0
  • 十六进制表示法:用 0x 前缀和 0-9a-f 表示,例如:0xff00,0xa5b4c3d2
  • 八进制表示法:用 0o 前缀和 0-7 表示,例如:0o12

Python 的整数长度为 32 位,可以通过内置函数获取最大值和最小值:

import sys

# 最大值
max_num = sys.maxsize
print(max_num) # 结果为 9223372036854775807

# 最小值
min_num = -sys.maxsize - 1
print(min_num) # 结果为 -9223372036854775808
1
2
3
4
5
6
7
8
9

# 浮点数(float)

浮点数也就是小数,如 1.23,3.14,-9.01 等等。

但是对于很大或很小的浮点数,一般用科学计数法表示,把 10 用 e 替代,1.23x10^9 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5 等等。

# 复数(complex)

复数由实数部分和虚数部分构成,可以用 a + bj,或者 complex(a, b) 表示。复数的实部 a 和虚部 b 都是浮点型。关于复数,如果不做科学计算或其它特殊需要通常很难遇到。

# 布尔

但在 Python 语言中,布尔类型只有两个值:TrueFalse。注意首字母要大写。

# 列表(List)

列表是 Python 中最基本也是最常用的数据结构之一。列表中的每个元素都被分配一个数字作为索引,用来表示该元素在列表内所排在的位置。第一个元素的索引是 0,第二个索引是 1,依此类推。

Python 的列表是一个有序可重复的元素集合,可嵌套、迭代、修改、分片、追加、删除,成员判断。

从数据结构角度看,Python 的列表是一个可变长度的顺序存储结构,每一个位置存放的都是对象的指针。

# 插入列表元素

使用 append(),insert() 方法插入指定的元素。

如果待插入的元素是列表、元组等,这种插入方式会将它们视为一个整体,作为一个元素添加进去。

# 列表的末尾追加元素
lis = ["element_1", "element_2", "element_3"]
lis.append("element_4")

# 在列表中间某个位置插入元素
# 下面代码将在索引 2 处插入元素
lis = ["element_1", "element_2", "element_3"]
lis.insert(1, 'element')
print(lis) # ["element_1", "element", "element_2", "element_3"]
1
2
3
4
5
6
7
8
9

# 删除列表元素

使用 del 语句或者 remove(),pop() 方法删除指定的元素。

# 删除索引为 0 的元素
lis = ["element_1", "element_2", "element_3"]
del lis[0]

# 除列表中匹配到的第一个 b 元素
lis = ["element_1", "element_2", "element_3", "element_1"]
lis.remove("element_1")

# 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
# 可选参数,要移除列表元素的索引值,不能超过列表总长度,默认为 index=-1,即删除最后一个列表值。
lis = ["element_1", "element_2", "element_3", "element_1"]
a= lis.pop()
b = lis.pop(1)
1
2
3
4
5
6
7
8
9
10
11
12
13

# 列表与列表合并

使用 + 运算符或者 extend() 方法合并两个列表。

# 使用 + 运算符
# 该方法会生成一个新的列表,原有的列表不会被改变。
lis_1 = ["element_1", "element_2"]
lis_2 = ["element_3", "element_4"]
print(lis_1 + lis_2) # ['element_1', 'element_2', 'element_3', 'element_4']

# 使用 extend() 
# 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
# 该方法没有返回值,但会在已存在的列表中添加新的列表内容。
lis_1 = ["element_1", "element_2"]
lis_2 = ["element_3", "element_4"]
lis_1.extend(lis_2)
print(lis_1) # ['element_1', 'element_2', 'element_3', 'element_4']
1
2
3
4
5
6
7
8
9
10
11
12
13

# 切片

切片指的是对序列进行截取,选取序列中的某一段。

切片的语法是:list[start:end],以冒号分割索引,start 代表起点索引,end 代表结束点索引。省略 start 表示以 0 开始,省略 end 表示到列表的结尾。

注意,区间是左闭右开的

分片不会修改原有的列表,可以将结果保存到新的变量,因此切片也是一种安全操作,常被用来复制一个列表,例如 newlist = lis[:]

如果提供的是负整数下标,则从列表的最后开始往头部查找。例如 -1 表示最后一个元素,-3 表示倒数第三个元素。

切片过程中还可以设置步长,以第二个冒号分割,例如 list[3:9:2],表示每隔多少距离取一个元素:

# 切片设置步长
lis = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(lis[2:8:2]) # [3, 5, 7]
1
2
3

# 元组(Tuple)

用方括号括起来的是列表,而用圆括号括起来的是元组,形如:

tup = (1, 2, 3, 4)
1

元组也是序列结构,但是是一种不可变序列,你可以简单的理解为内容不可变的列表。除了在内部元素不可修改的区别外,元组和列表的用法差不多。

元组与列表相同的操作

  • 使用方括号加下标访问元素
  • 切片(形成新元组对象)
  • count() / index()
  • len() / max() / min() / tuple()

元组中不允许的操作,确切的说是元组没有的功能

  • 修改、新增元素
  • 删除某个元素(但可以删除整个元组)
  • 所有会对元组内部元素发生修改动作的方法。例如,元组没有 remove,append,pop 等方法。

但需要注意:元组只保证它的一级子元素不可变,对于嵌套的元素内部,不保证不可变。所以,在使用元组的时候,尽量使用数字、字符串和元组这种不可变的数据类型作为元组的元素,这样就能确保元组不发生变化。

元组和列表之间的转换:

  • 使用 list() 函数可以把元组转换成列表:list(元组)
  • 使用 tuple() 函数可以把列表转换成元组:tuple(列表)

# 字符串

字符串是 Python 中最常用的数据类型之一,使用单引号或双引号来创建字符串,使用三引号创建多行字符串。

Python3 全面支持 Unicode 编码,所有的字符串都是 Unicode 字符串,所以传统 Python2 存在的编码问题不再困扰我们,可以放心大胆的使用中文。

# 字符编码

计算机只能处理数字 0 和 1,如果要处理文本,就必须先把文本转换为数字 01,这种转换方式就称为字符编码。

对于我们而言,你只需要简单记住下面几种常见的编码就好:

  • ASCII 编码:早期专门为英语语系编码,只有 255 个字符,每个字符需要 8 位也就是 1 个字节。不兼容汉字。
  • Unicode 编码:又称万国码,国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。用 2 个字节来表示汉字。
  • UTF-8 编码:为了节省字节数,在 Unicode 的基础上进行优化的编码。用 1 个字节表示英文字符,3 个字符表示汉字。天生兼容 ASCII 编码,所以最为流行。
  • GB2312:我国早期自己制定的中文编码,世界范围内不通用。
  • GBK:全称《汉字内码扩展规范》,向下与 GB2312 兼容,向上支持 ISO10646.1 国际标准,是前者向后者过渡过程中的一个承上启下的产物。Windows 中文版的汉字编码用的就是 GBK。也非世界范围通用的编码。
  • 其它编码:非以上类型者的统称。属于能不用就不要碰的编码。

需要再强调一次,Python3 在运行时全部使用 Unicode 编码!

另外还有几条规则需要记住:

  • 操作系统运行时,在内存中,统一使用的都是 Unicode 编码,当需要将数据保存到硬盘或者网络传输的时候,就转换为 UTF-8 编码,进行保存和传输。
  • 用文本编辑器的时候,从文件系统或者说硬盘上读取的 UTF-8 编码字符被转换为 Unicode 字符到内存里,供程序或者操作系统使用。编辑完成后,保存的时候再把 Unicode 转换为 UTF-8 保存到文件。
  • 浏览网页的时候,服务器会把动态生成的 Unicode 内容转换为 UTF-8 传输到客户的浏览器。

这就是为什么我们平时一会说 Unicode,一会又用 UTF-8 的原因。

总而言之,一定要区分代码自己本身的编码和程序要处理的数据的编码!没有特殊要求的情况,请使用 UTF-8 编码。确保文本编辑器使用的是 UTF-8 without BOM 编码。

# 字典

Python的 字典数据类型是基于 hash 散列算法实现的,采用键值对 (key: value) 的形式,根据 key 的值计算 value 的地址,具有非常快的查取和插入速度。

字典包含的元素个数不限,值的类型可以是任何数据类型。但是字典的 key 必须是不可变的对象,例如整数、字符串、bytes 和元组,最常见的还是将字符串作为 key。同时,同一个字典内的key必须是唯一的,但值则不必。

注意:从 Python3.6 开始,字典是有序的!它将保持元素插入时的先后顺序!请务必清楚!

# 创建字典

创建字典有两种方法:

dic = {'name': 'zhangsan', 'age': 13}

dict(
    name='lisi',
    age=14
)
1
2
3
4
5
6

# 访问字典

可以通过方括号获取对应值,但是如果访问字典里没有的键,会抛出异常:

dic = {'name': 'zhangsan', 'age': 13}

name = dic['name']
1
2
3

也可以通过字典的 get() 方法返回指定键的值,如果键不在字典中,则返回 default 值,如果不指定默认值,则返回 None

dic = {'name': 'zhangsan', 'age': 13}

name = dic.get('name', 'xxx')
1
2
3

# 删除字典元素、清空字典和删除字典

使用 del 关键字删除字典元素或者字典本身,使用字典的 clear() 方法清空字典。

# 删除指定的键
dic = {'name': 'zhangsan', 'age': 13}
del dic['name'] 

# 删除指定的键,并返回该键对应的值、
dic = {'name': 'zhangsan', 'age': 13}
a = dic.pop('age')

# 清空字典
dic = {'name': 'zhangsan', 'age': 13}
dic.clear()

# 删除字典本身,删除后该字典就不存在了
dic = {'name': 'zhangsan', 'age': 13}
del dic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 遍历字典

从 Python3.6 开始遍历字典获得的键值对是有序的。

以下展示的多种遍历方法,都是经常会用到的:

dic = {'name': 'zhangsan', 'age': 13}

# 直接遍历字典获取键,根据键取值
for key in dic:
    print(key, dic[key])

# 利用 items 方法获取键值,速度很慢,少用!
for key,value in dic.items():
    print(key, value)

# 利用 keys 方法获取键
for key in dic.keys():
    print(key, dic[key])

# 利用 values 方法获取值,但无法获取对应的键。
for value in dic.values():
    print(value)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

此外,如果只是要统计字典内键的个数,可以使用 Python 内置的 len() 函数:

dic = {'name': 'zhangsan', 'age': 13}
len(dic)
1
2

# bytes

在 Python3 以后,字符串和 bytes 类型彻底分开了。字符串是以字符为单位进行处理的,bytes 类型是以字节为单位处理的。

对于 bytes,我们只要知道在 Python3 中某些场合下强制使用,以及它和字符串类型之间的互相转换,其它的基本照抄字符串。

简单的省事模式:

string = b'xxxxxx'.decode() 直接以默认的 utf-8 编码解码 bytes 成 string。

b = string.encode() 直接以默认的 utf-8 编码 string 为 bytes。

# 集合set

set 集合是一个无序不重复元素的集,基本功能包括关系测试和消除重复元素。集合使用大括号({})框定元素,并以逗号进行分隔。

但是注意:如果要创建一个空集合,必须用 set() 而不是 {} ,因为后者创建的是一个空字典。

集合数据类型的核心在于自动去重。很多时候,这能给你省不少事。

s = set([1, 1, 2, 3, 3, 4])
print(s) # {1, 2, 3, 4}
1
2

(完)