Python基础(14)——常用模块(三)

5. 序列化相关模块

序列化是指将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式的过程称为序列化;反之称为反序列化。

序列化的目的:

  • 以某种存储形式使自定义对象持久化。
  • 将对象从某一个地方 传递到另一个地方。
  • 是程序更容易维护。

5.1 json模块

该模块主要用于json格式字符串和python数据类型间进行互相转换,该模块中提供了如下4个方法:dumps()、loads()、dump()、load()

  1. dumps():序列化,将Python中的值转换为json格式的字符串,可以转换大部分的基本数据类型。
  2. loads():反序列化,将json格式的字符串转换成Python的数据类型。
  3. dump():序列化,将Python中的值转换为json格式的字符串并将其保存到文件中,通过传入文件句柄。
  4. 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()

主要方法

  1. add():向集合中添加元素。
  2. remove():删除指定元素。
  3. discard():删除指定元素,与remove()方法不同的是,如果要删除的元素不存在时不会抛出异常。
  4. copy():复制一个集合。
  5. pop():随机删除集合中一个元素并返回。
  6. issubset():判断是否为一个集合的子集。
  7. issuperset():判断一个集合是否为父集合。
  8. clear():清空集合中的元素。
  9. difference():对集合做减法操作,与-执行运算的效果相同。
  10. difference_update():对集合做减法操作,并改变集合本身。
  11. intersection():获取两个集合的交集,与&执行运算的效果相同。
  12. intersection_update():获取两个集合的交集,并改变集合本身。
  13. union():计算两个集合的并集,不改变集合本身。
  14. update():计算两个集合的并集,改变集合本身。
  15. isdisjoint():判断集合是否相交,不相交返回True,相交返回False
  16. symmetric_difference():返回两个集合中包含的所有元素,但不包含两个集合中共同存在的元素,也就相当于异或。
  17. 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()

常用方法

  1. append():在队列右边添加元素。
  2. appendleft():在队列左边添加元素。
  3. pop():弹出队列右边的元素,并返回。
  4. popleft():弹出队列左边的元素,并返回。
  5. extend():在队列右端添加多个元素。
  6. extendleft():在队列左边添加多个元素。
  7. copy():复制一个双端队列。
  8. clear():清空队列中的元素。
  9. count():统计指定元素在队列中出现的次数。
  10. index():返回指定元素在队列中的位置。
  11. insert():在队列指定位置插入元素。
  12. rotate():将队列的队尾元素移动到队头,使之首尾相连。

6.3 堆(heap)

简单来说就是用数组实现的二叉树,堆一共分为两种,大顶堆和小顶堆,两者的差别在与节点的排序方式。在大顶堆中,父节点的值比每一个子节点的值都要大,在小顶堆中,父节点的值比每一个子节点的值都要小。

Python中并没有提供"堆"这种数据类型,它直接把列表当成堆来处理。而是提供了一些函数,当使用这些函数来操作列表时,该列表就会表现出"堆"的行为。

常用函数:

  1. heapify(heap):将堆属性应用到列表上。
  2. heappush(heap, item):将item元素加入堆。
  3. heappop(heap):将堆中最小的元素弹出,并返回其值。
  4. heappushpop(heap, item):将item入堆, 然后弹出堆中最小的元素,并返回其值。
  5. heapreplace(heap, x):将堆中最小元素弹出,并将元素x入堆。
  6. merge(*iterables, key=None, reverse=False):将多个有序的堆合并成一个大的有序堆,返回一个生成器。
  7. nlargest(n, iterable, key=None):返回堆中最大的n个 元素。
  8. 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})

常用的方法

  1. element():该方法返回Counter所包含的全部元素组成的迭代器。
  2. most_common(n):该方法返回Counter中出现最多的n个元素。
  3. subtract(iterable):该方法就相当于计算Counter的减法,减去各个元素出现的次数。

还有一些类似字典的操作,不再赘述。

6.4.3 defaultdict对象

该类是dict类的子类,支持dict的所有功能。它最大的特点就是在对其根据一个不存在的key来访问value的时候它不会引发异常,defaultdict可以体提供一个default_factory属性,该属性所指定的函数负责为不存在的key来生成value

6.4.4 OrderedDict对象

该类也是dict类的子类,它最大的特点就是其中保存的键值对是有序的,也就是说先添加的键值对在前面,后添加的键值对排在后面。

其用法与dict用法类似。

其中提供了一些特有的方法:

  1. popitem(last=True):默认弹出并返回最右边的键值对,如果将last参数设置为False,则弹出并返回最左边的键值对。
  2. move_to_end(key, last=True):默认将指定的键值对移动到最右边,如果将last参数改为False,则将指定的键值对移动到最左边。

如有错误欢迎批评指正!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值