常用模块——json、pickle、collections等
5. 序列化相关模块
序列化是指将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式的过程称为序列化;反之称为反序列化。
序列化的目的:
- 以某种存储形式使自定义对象持久化。
- 将对象从某一个地方 传递到另一个地方。
- 是程序更容易维护。
5.1 json模块
该模块主要用于json
格式字符串和python
数据类型间进行互相转换,该模块中提供了如下4个方法:dumps()、loads()、dump()、load()
。
dumps()
:序列化,将Python
中的值转换为json
格式的字符串,可以转换大部分的基本数据类型。loads()
:反序列化,将json
格式的字符串转换成Python
的数据类型。dump()
:序列化,将Python
中的值转换为json
格式的字符串并将其保存到文件中,通过传入文件句柄。load()
:反序列化,将存在文件中的json
格式的字符串转换成Python
中的值,通过传入文件句柄。
5.2 pickle模块
该模块可以序列化和反序列化Python
中的几乎所有数据类型,包括类,但是该模块只能在Python
中使用,序列化后的数据可读性差。
该模块中的序列化与反序列化的方法与json
模块中的相同,用法也大体相同。
注:在反序列化一个类对象时,需要有对应的类的定义,如果没有,将会报错。
import pickle
class Test:
def __init__(self, arg):
self.arg = arg
t = Test(1)
p_t = pickle.dumps(t)
print(p_t)
del Test
t1 = pickle.loads(p_t)
上述代码执行到最后一行将会报错,如果将del Test
这句注释掉将能正常运行。
6. 容器相关
6.1 set和frozenset
set
集合有如下两个特征:
set
不记录元素的添加顺序。- 元素不允许重复。
构建set
集合的方式:
# 1. 直接使用花括号
s = {'a', 'b'}
# 2. 实例化set类构造
s = set()
主要方法
add()
:向集合中添加元素。remove()
:删除指定元素。discard()
:删除指定元素,与remove()
方法不同的是,如果要删除的元素不存在时不会抛出异常。copy()
:复制一个集合。pop()
:随机删除集合中一个元素并返回。issubset()
:判断是否为一个集合的子集。issuperset()
:判断一个集合是否为父集合。clear()
:清空集合中的元素。difference()
:对集合做减法操作,与-
执行运算的效果相同。difference_update()
:对集合做减法操作,并改变集合本身。intersection()
:获取两个集合的交集,与&
执行运算的效果相同。intersection_update()
:获取两个集合的交集,并改变集合本身。union()
:计算两个集合的并集,不改变集合本身。update()
:计算两个集合的并集,改变集合本身。isdisjoint()
:判断集合是否相交,不相交返回True
,相交返回False
。symmetric_difference()
:返回两个集合中包含的所有元素,但不包含两个集合中共同存在的元素,也就相当于异或。symmetric_difference_update()
:与上个函数的功能相同,不同的是该函数会改变集合本身。
运算符与函数对应关系
运算符 | 对应函数 |
---|---|
<= | 相当于调用issubset() 方法 |
>= | 相当于调用issuperset() 方法 |
- | 相当于调用difference() 方法 |
& | 相当于调用intersection() 方法 |
^ | 相当于调用symmetric_difference() 方法 |
frozenset
的作用:
- 当集合元素不需要改变时,使用
frozenset
代替set
更安全 - 当某些
API
需要不可变对象时,必须使用frozenset
代替set
。例如set
中包含的元素只能是不可变对象,所以如果set
中要包含集合,只能包含frozenset
。
6.2 双端队列(deque)
双端队列代表的是一种特殊的队列,它允许在不队列两端同时进行插入和删除操作。
双端队列的使用方式
from collections import deque
d = deque()
常用方法
append()
:在队列右边添加元素。appendleft()
:在队列左边添加元素。pop()
:弹出队列右边的元素,并返回。popleft()
:弹出队列左边的元素,并返回。extend()
:在队列右端添加多个元素。extendleft()
:在队列左边添加多个元素。copy()
:复制一个双端队列。clear()
:清空队列中的元素。count()
:统计指定元素在队列中出现的次数。index()
:返回指定元素在队列中的位置。insert()
:在队列指定位置插入元素。rotate()
:将队列的队尾元素移动到队头,使之首尾相连。
6.3 堆(heap)
堆简单来说就是用数组实现的二叉树,堆一共分为两种,大顶堆和小顶堆,两者的差别在与节点的排序方式。在大顶堆中,父节点的值比每一个子节点的值都要大,在小顶堆中,父节点的值比每一个子节点的值都要小。
Python
中并没有提供"堆"这种数据类型,它直接把列表当成堆来处理。而是提供了一些函数,当使用这些函数来操作列表时,该列表就会表现出"堆"的行为。
常用函数:
heapify(heap)
:将堆属性应用到列表上。heappush(heap, item)
:将item
元素加入堆。heappop(heap)
:将堆中最小的元素弹出,并返回其值。heappushpop(heap, item)
:将item
入堆, 然后弹出堆中最小的元素,并返回其值。heapreplace(heap, x)
:将堆中最小元素弹出,并将元素x
入堆。merge(*iterables, key=None, reverse=False)
:将多个有序的堆合并成一个大的有序堆,返回一个生成器。nlargest(n, iterable, key=None)
:返回堆中最大的n
个 元素。nsmallest(n, iterable, key=None)
:返回堆中最小的n
个元素。
6.4 其它常用容器
6.4.1 ChainMap对象
该类也是collections
包中的容器。它的主要作用就是使用链的方式将多个dict
链接在一起,然后我们可以获取任意一个dict
所包含的key
对应的value
,如果键值相同,则会返回排在前面的字典中的key
对应的value
。
from collections import ChainMap
d1 = {'a': 1, 'b': 2}
d2 = {'a': 4, 'd': 5}
d12 = ChainMap(d1, d2)
print(d12['a'])
#======output======
1
6.4.2 Counter对象
该类也是collections
包中的工具,它主要作用就是统计容器中各个元素出现的次数。
它的本质就是一个特殊的dict
,只不过它的key
都是其所包含的元素,而它的value
记录了该key
出现的次数。
from collections import Counter
l = ['a', 'b', 'c', 'a']
c = Counter(l)
print(c)
#====output======
Counter({'a': 2, 'b': 1, 'c': 1})
常用的方法
element()
:该方法返回Counter
所包含的全部元素组成的迭代器。most_common(n)
:该方法返回Counter
中出现最多的n
个元素。subtract(iterable)
:该方法就相当于计算Counter
的减法,减去各个元素出现的次数。
还有一些类似字典的操作,不再赘述。
6.4.3 defaultdict对象
该类是dict
类的子类,支持dict
的所有功能。它最大的特点就是在对其根据一个不存在的key
来访问value
的时候它不会引发异常,defaultdict
可以体提供一个default_factory
属性,该属性所指定的函数负责为不存在的key
来生成value
。
6.4.4 OrderedDict对象
该类也是dict
类的子类,它最大的特点就是其中保存的键值对是有序的,也就是说先添加的键值对在前面,后添加的键值对排在后面。
其用法与dict
用法类似。
其中提供了一些特有的方法:
popitem(last=True)
:默认弹出并返回最右边的键值对,如果将last
参数设置为False
,则弹出并返回最左边的键值对。move_to_end(key, last=True)
:默认将指定的键值对移动到最右边,如果将last
参数改为False
,则将指定的键值对移动到最左边。
如有错误欢迎批评指正!!