数据类型
# 数据类型
在 Python 中,数据类型分内置的和自定义的。内置的共有 8 种常用的以及一些不太常用的数据类型;而自定义的一般以类的形式,根据需要组合内置类型成为独特的数据类型。
8 种常用内置数据类型:
- 数字
- 布尔
- 列表
- 元组
- 字符串
- 字典
- bytes
- 集合 set
# 数字
Python 支持三种不同的数字类型,整数、浮点数和复数:
# 整数(Int)
通常被称为整型,是正或负整数,不带小数点。Python3 的整型可以当作 Long 类型(更长的整型)使用,所以 Python3 没有 Python2 的 Long 类型。
- 十进制表示法:1,100,-8080,0
- 十六进制表示法:用
0x
前缀和0-9
,a-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
2
3
4
5
6
7
8
9
# 浮点数(float)
浮点数也就是小数,如 1.23,3.14,-9.01 等等。
但是对于很大或很小的浮点数,一般用科学计数法表示,把 10 用 e 替代,1.23x10⁹ 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5 等等。
# 复数(complex)
复数由实数部分和虚数部分构成,可以用 a + bj
,或者 complex(a, b)
表示。复数的实部 a 和虚部 b 都是浮点型。关于复数,如果不做科学计算或其它特殊需要通常很难遇到。
# 布尔
但在 Python 语言中,布尔类型只有两个值:True
与 False
。注意首字母要大写。
# 列表(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"]
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)
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']
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]
2
3
# 元组(Tuple)
用方括号括起来的是列表,而用圆括号括起来的是元组,形如:
tup = (1, 2, 3, 4)
元组也是序列结构,但是是一种不可变序列,你可以简单的理解为内容不可变的列表。除了在内部元素不可修改的区别外,元组和列表的用法差不多。
元组与列表相同的操作:
- 使用方括号加下标访问元素
- 切片(形成新元组对象)
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
)
2
3
4
5
6
# 访问字典
可以通过方括号获取对应值,但是如果访问字典里没有的键,会抛出异常:
dic = {'name': 'zhangsan', 'age': 13}
name = dic['name']
2
3
也可以通过字典的 get() 方法返回指定键的值,如果键不在字典中,则返回 default 值,如果不指定默认值,则返回 None
:
dic = {'name': 'zhangsan', 'age': 13}
name = dic.get('name', 'xxx')
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
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)
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)
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}
2
(完)