下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922
论坛 >编程语言 >Python 中的高级数据结构(2)

Python 中的高级数据结构(2)

Abby发布于 2018-01-25 09:26查看:667回复:2

4. Bisect

bisect模块能够提供保持list元素序列的支持。它使用了二分法完成大部分的工作。它在向一个list插入元素的同时维持list是有序的。在某些情况下,这比重复的对一个list进行排序更为高效,并且对于一个较大的list来说,对每步操作维持其有序也比对其排序要高效。

假设你有一个range集合:

image.png

如果我想添加一个range (250, 400),我可能会这么做:

image.png

我们可以使用bisect()函数来寻找插入点:

image.png

bisect(sequence, item) => index 返回元素应该的插入点,但序列并不被修改。

image.png

新元素被插入到第5的位置。

5. Weakref

weakref模块能够帮助我们创建Python引用,却不会阻止对象的销毁操作。这一节包含了weak reference的基本用法,并且引入一个代理类。

在开始之前,我们需要明白什么是strong reference。strong reference是一个对对象的引用次数、生命周期以及销毁时机产生影响的指针。strong reference如你所见,就是当你将一个对象赋值给一个变量的时候产生的:

image.png

在这种情况下,这个列表有两个strong reference,分别是a和b。在这两个引用都被释放之前,这个list不会被销毁。

image.png

Weak reference则是对对象的引用计数器不会产生影响。当一个对象存在weak reference时,并不会影响对象的撤销。这就说,如果一个对象仅剩下weak reference,那么它将会被销毁。

你可以使用weakref.ref函数来创建对象的weak reference。这个函数调用需要将一个strong reference作为第一个参数传给函数,并且返回一个weak reference。

image.png

一个临时的strong reference可以从weak reference中创建,即是下例中的b():

image.png

请注意当我们删除strong reference的时候,对象将立即被销毁。

image.png

如果试图在对象被摧毁之后通过weak reference使用对象,则会返回None:

image.png

若是使用weakref.proxy,就能提供相对于weakref.ref更透明的可选操作。同样是使用一个strong reference作为第一个参数并且返回一个weak reference,proxy更像是一个strong reference,但当对象不存在时会抛出异常。

image.png

完整的例子:

引用计数器是由Python的垃圾回收器使用的,当一个对象的应用计数器变为0,则其将会被垃圾回收器回收。

最好将weak reference用于开销较大的对象,或避免循环引用(虽然垃圾回收器经常干这种事情)。

image.png

提示:只有library模块中定义的class instances、functions、methods、sets、frozen sets、files、generators、type objects和certain object types(例如sockets、arrays和regular expression patterns)支持weakref。内建函数以及大部分内建类型如lists、dictionaries、strings和numbers则不支持。

6. Copy()

通过shallow或deep copy语法提供复制对象的函数操作。

shallow和deep copying的不同之处在于对于混合型对象的操作(混合对象是包含了其他类型对象的对象,例如list或其他类实例)。

  • 对于shallow copy而言,它创建一个新的混合对象,并且将原对象中其他对象的引用插入新对象。

  • 对于deep copy而言,它创建一个新的对象,并且递归地复制源对象中的其他对象并插入新的对象中。

普通的赋值操作知识简单的将心变量指向源对象。

image.png

shallow copy (copy())操作创建一个新的容器,其包含的引用指向原对象中的对象。

deep copy (deepcopy())创建的对象包含的引用指向复制出来的新对象。

复杂的例子:

假定我有两个类,名为Manager和Graph,每个Graph包含了一个指向其manager的引用,而每个Manager有一个指向其管理的Graph的集合,现在我们有两个任务需要完成:

1) 复制一个graph实例,使用deepcopy,但其manager指向为原graph的manager。

2) 复制一个manager,完全创建新manager,但拷贝原有的所有graph。

image.png

7. Pprint()

Pprint模块能够提供比较优雅的数据结构打印方式,如果你需要打印一个结构较为复杂,层次较深的字典或是JSON对象时,使用Pprint能够提供较好的打印结果。

假定你需要打印一个矩阵,当使用普通的print时,你只能打印出普通的列表,不过如果使用pprint,你就能打出漂亮的矩阵结构

如果

image.png

额外的知识

一些基本的数据结构

1. 单链链表

image.png

2. 用Python实现的普林姆算法

译者注:普林姆算法(Prims Algorithm)是图论中,在加权连通图中搜索最小生成树的算法。

image.png

收藏(0)0
查看评分情况

全部评分

此主贴暂时没有点赞评分

总计:0

回复分享

版主推荐

    共有2条评论

    • IT宅男
    • mr jack
    • Mr ken
    • Mright
    • cappuccino
    • YUI
    • 课课家运营团队
    • 课课家技术团队1
    • 酸酸~甜甜
    • 选择版块:

    • 标题:

    • 内容

    • 验证码:

    • 标题:

    • 内容

    • 选择版块:

    移动帖子x

    移动到: