Python 3标准库课件第二章
第二章
一、如列表(list)、元组(tuple)、字典(dict)、集合(set)
二、
2.1 enum:枚举类型
enum模块定义了一个提供迭代和比较功能的枚举类型。可以用这个模块为值创建明确定义的符号,而不是使用字面量整数或字符串。
2.1.1 创建枚举
可以使用class语法派生Enum并增加描述值的类属性来定义一个新枚举。
enum_create.py
import enum
new = 7
incomplete = 6
invalid = 5
wont_fix = 4
in_progress = 3
fix_committed = 2
fix_released = 1
print('\nMember name: {}'.format(BugStatus.wont_fix.name))
print('Member name: {}'.format(BugStatus.wont_fix.value))
print('\nMember new: {}'.format(BugStatus.new.name))
print('Member new: {}'.format(BugStatus.new.value))
解析这个类时,Enum的成员会被转换为实例。每个实例有一个对应成员名的name属性,另外有一个value属性,对应为类定义中的名所赋的值。
2.1.2 迭代
迭代处理enum类会生成枚举的各个成员。
enum_iterate.py
import enum
new = 7
incomplete = 6
invalid = 5
wont_fix = 4
in_progress = 3
fix_committed = 2
fix_released = 1
for status in BugStatus:
print('{:15} = {}'.format(status.name, status.value))
由于枚举成员是无序的,所以它们只支持按同一性和相等性进行比较。
-------------------------------------------------------------
import enum
new = 7
incomplete = 6
invalid = 5
wont_fix = 4
in_progress = 3
fix_committed = 2
fix_released = 1
actual_state = BugStatus.wont_fix
desired_state = BugStatus.fix_released
print('Equality:',
actual_state == desired_state,
actual_state == BugStatus.wont_fix)
print('Identity',
actual_state is desired_state,
actual_state is BugStatus.wont_fix )
print('Ordered by value: ')
try:
print('\n'.join(' ' + s.name for s in sorted(BugStatus)))
except TypeError as err:
print(' Cannot sort: {}'.format(err))
----------------------------------------------------
2.1.4 有些枚举中的成员要表现得更像数字,例如,要支持比较,对于这些枚举要使用IntEnum类。
----------------------------------------------------
enum_intenum.py
---------------
import enum
new = 7
incomplete = 6
invalid = 5
wont_fix = 4
in_progress = 3
fix_committed = 2
fix_released = 1
print('Ordered by value: ')
print('\n'.join(' ' + s.name for s in sorted(BugStatus)))
------------------------------------------------------
2.1.4 唯一枚举值
有相同值的Enum成员会被处理为同一个成员对象的别名引用。别名可以避免Enum的迭代器中出现重复的值。
-------------------------------------------------------
enum_aliases.py
----------------
new = 7
incomplete = 6
invalid = 5
wont_fix = 4
in_progress = 3
fix_committed = 2
fix_released = 1
by_design = 4
closed = 1
for status in BugStatus:
print('{:15} = {}'.format(status.name, status.value))
print('\nSame: by_design is wont_fix: ',
BugStatus.by_design is BugStatus.wont_fix)
print('Same: closed is fix_released: ',
BugStatus.closed is BugStatus.fix_released)
---------------------------------------------------
由于by_design和closed是其他成员的别名,迭代处理Enum时它们不会单独出现在输出中。一个成员的规范名是与这个值关联的第一个名字。
---------------------------------------------------
如果要求所有成员有唯一的值,则要为Enum增加@unique修饰符。
----------------------------------------------------
import enum
class BugStatus(enum.IntEnum):
new = 7
incomplete = 6
invalid = 5
wont_fix = 4
in_progress = 3
fix_committed = 2
fix_released = 1
# This will trigger an error with unique applied.
by_design = 4
closed = 1
------------------------------------------------
2.1.5
有些情况下,通过编程创建枚举会更方便,而不是在类定义中硬编码定义枚举。在这些情况下,Enum还支持向类构造函数传递成员名和值。
---------------------------------------------------
import enum
value='BugStatus',
names = [
('new', 7),
('incomplete', 6),
('invalid', 5),
('wont_fix', 4),
('in_progress', 3),
('fix_committed', 2),
('fix_released', 1),
],
)
print('All members:')
for status in BugStatus:
print('{:15} = {}'.format(status.name, status.value))
-----------------------------------------------------
2.1.6
非整数成员值
Enum成员值并不仅限于整数。任何类型的对象都可以与成员关联。如果值是一个元组,那么成员会作为单个参数被传递到_ _init_ _()。
enum_tuple_values.py
------------------------------------------
2.2 collections:容器数据类型
------------------------------------------
collections模块包含内置类型list、dict和tuple以外的其他容器数据类型。
------------------------------------------
2.2.1
------------------------------------------
ChainMap:搜索多个字典
------------------------------------------
2.2.1.1
------------------------------------------
ChainMap支持与常规字典相同的API来访问现有的值。
------------------------------------------
2.2.1.2
-------------------------------------------
ChainMap会在它的maps属性中存储要搜索的映射列表。这个列表是可变的,所以可以直接增加新映射,或者改变元素的顺序以控制查找和更新行为。
-------------------------------------------
逆置映射列表时,与'c'关联的值会改变。
------------------------------------------
2.2.1.3 更新值
------------------------------------------
ChainMap不会缓存子映射中的值。因此,如果它们的内容有修改,则访问ChainMap时会反映到结果中。
正是基于这种堆栈行为,可以很方便地使用ChainMap实例作为模板或应用上下文。具体地,可以很容易地在一次迭代中增加或更新值,然后在下一次迭代中丢弃这些改变。
如果新上下文已知或提前构建,还可以向new_child()传递一个映射。
------------------------------------------
2.2.2 Counter:统计可散列的对象
------------------------------------------
Counter是一个容器,可以跟踪等效值增加的次数。这个类可以用来实现其他语言中常用包(bag)或多集合(multiset)数据结构实现的算法。
------------------------------------------
2.2.2.1 初始化
---------------
Counter支持3种形式的初始化。调用Counter的构造函数时可以提供一个元素序列或者一个包含键和计数的字典,还可以使用关键字参数将字符串名映射到计数。
---------------
2.2.2.2 访问计数
-------------------
一旦填充了Counter,便可以使用字典API获取它的值。
-------------------
elements()方法返回一个迭代器,该迭代器将生成Counter知道的所有元素。
2.2.2.3 算术操作
2.2.4 双端队列
双端队列deque支持从任意一端增加和删除元素。更为常用的两种结构(即栈和队列)就是双端队列的退化形式,它们的输入和输出被限制在某一端。
-------------------
2.2.4.1 填充
-------------------
可以从任意一端填充deque,其在Python实现中被称为"左端"和"右端"。
-------------------
2.2.4.2 消费
-------------------
使用pop()可以deque的右端删除一个元素,使用popleft()可以从左端取一个元素。
-------------------
2.2.4.3 旋转
--------------------
deque的另一个很有用的方面士可以按任意一个方向旋转,从而跳过一些元素。
--------------------
另一方面,使用tuple时需要记住对应各个值要使用哪个索引,这可能会导致错误,特别是当tuple有大量字段,而且构造元组和使用元组的位置相距很远时。namedtuple除了各个成员指定数值索引外,
还为其指定名字。
--------------------
2.2.5.1 定义
--------------------
2.2.5.2 非法字段名
如果字段名重复或者与Python关键字冲突,那么其就是非法字段名。
-------------------
2.2.6.2 重排
------------------
2.2.3 defaultdict:缺少的键返回一个默认值
------------------
2.2.4 deque:双端队列
------------------
2.2.4.1 填充
------------------
2.2.4.2 消费
------------------
2.2.4.3 旋转
------------------
2.2.4.4 限制队列大小
-------------------
2.2.5 namedtuple:带命名字段的元组子类
-------------------
2.2.5.1 定义
-------------------
2.2.5.2 非法字段名
-------------------
2.2.5.3 指定属性
-------------------
2.2.6 OrderedDict:记住向字典中增加键的顺序
-------------------
2.2.6.1 相等性
-------------------
2.2.7 collections.abc:容器的抽象基类
-------------------
2.3 数组:固定类型数据序列
-------------------
2.3.3 数组和文件
--------------------
可以使用专门的高效读写文件的内置方法将数组的内容写入文件或从文件读出数组。
-------------------
2.4 heapq:堆排序算法
堆时一种树形数据结构,其中子节点与父节点有一种有序关系。二叉堆(binary heap)可以使用一个有组织的列表或数组表示,其中元素N的子元素位于2*N+1和2*N+2(索引从0开始)。这种布局允许原地
重新组织堆,从而不必在增加或删除元素时重新分配大量内存。
最大堆(max-heap)确保父节点大于或等于其两个子节点。最小堆(min-heap)要求父节点小于或等于子节点。Python的heapq模块实现了一个最小堆。
--------------------
2.4.2 创建堆
创建堆的两种基本方式:heappush()和heapify()。
--------------------
2.4.3 访问堆的内容
--------------------
一旦堆已经被正确组织,则可以heappop()删除有最小值的元素。
--------------------
2.4.4 堆的数据极值
--------------------
heapq还包括两个检查可迭代对象(iterable)的函数,可以查找其中包含的最大或最小值的范围。
--------------------
2.5 bisect:维护有序列表
--------------------
bisect模块实现了一个算法来向列表中插入元素,同时仍保持列表有序。
--------------------
2.5.1 有序插入
--------------------
下面给出一个简单的例子,这里使用insort()按有序顺序向一个列表中插入元素。
--------------------
2.6 queue:线程安全的FIFO实现
--------------------
2.6.2 LIFO队列
--------------------
与Queue的标准FIFO实现相反,LifoQueue使用了(通常与栈数据结构关联的)后进先出(LIFO, last-in, first-out)顺序。
--------------------
2.6.3 优先队列
--------------------
2.7 struct:二进制数据结构
--------------------
2.7.4 缓冲
--------------------
2.8.3 最终化对象
--------------------
清理弱引用时要对资源完成更健壮的管理,可以使用finalize将回调与对象关联。finalize实例会一直保留(直到所关联的对象被删除),即使应用并没有保留最终化对象的引用。
--------------------
由于为finalize提供的callable是实例obj的一个绑定方法,所以最终化方法保留了obj的一个引用,它不能被删除和被垃圾回收。
--------------------
2.8.4 代理
--------------------
有时使用代理比使用弱引用更方便。使用代理可以像使用原对象一样,而且不要求在访问对象之前先调用代理。这说明,可以将代理传递到一个库,而这个库不知道它接收的是一个引用
而不是真正的对象。
---------------------
2.8.5 缓存对象
---------------------
ref和proxy类被认为是“底层”的。尽管它们对维护单个对象的弱引用很有用,并且还支持对循环引用的垃圾回收,但WeakKeyDictionary和WeakValueDictionary类为创建多个对象的缓存提供
一个更合适的API。
WeakValueDictionary类使用它包含的值的弱引用,当其他代码不再真正使用这些值时,则允许垃圾回收。利用垃圾回收器的显式调用,下面展示了使用常规字典和WeakValueDictionary完成
内存处理的区别:
-----------------------
2.9 copy:复制对象
-----------------------
copy模块包括两个函数copy()和deepcopy(),用于复制现有的对象。
-----------------------
2.9.1 浅副本
-----------------------
copy()创建的浅副本(shallow copy)是一个新容器,其中填充了原对象内容的引用。建立list对象的一个浅副本时,会构造一个新的list,并将原对象的元素追加到这个list。
-----------------------
2.9.2 深副本
-----------------------
deepcopy()创建的深副本是一个新容器,其中填充了原对象内容的副本。要建立一个list的深副本,会构造一个新的list,复制原列表的元素,然后将这些副本追加到新列表。
-----------------------
2.9.3 定制复制行为
-----------------------
2.10 pprint:美观打印数据结构
-----------------------
2.10.5 限制嵌套输出
-----------------------
3.1.1.3 其他 callable
-----------------------
3.1.1.4 方法和函数
-----------------------
3.1.1.5 获取修饰符的函数属性
-----------------------
3.1.2 比较
-----------------------
3.1.3 缓存
----------------------
lru_cache()修饰符将一个函数包装在一个“最近最少使用的”缓存中。
----------------------
3.1.4 缩减数据集
----------------------
reduce()函数取一个callable和一个数据序列作为输入。他会用这个序列中的值调用这个callable,并累加得到的输出来生成单个值作为输出。
----------------------
Python 3标准库课件第二章的更多相关文章
- Python 3标准库课件第一章(第二版)
第一章文本1.1 string:文本常量和模板1.2 textwrap:格式化文本段落1.3 re:正则表达式1.4 difflib:比较序列str类,string.Templatetextwrap ...
- Python 3标准库课件第一章
第一章文本1.1 string:文本常量和模板1.2 textwrap:格式化文本段落1.3 re:正则表达式1.4 difflib:比较序列str类,string.Templatetextwrap ...
- Python 3标准库第四章
第四章日期和时间----------------- 不同于int.float和str,Python没有包含对应日期和时间的原生类型,不过提供了3个相应的模块,可以采用多种表示来管理日期和时间值. ...
- Python 3标准库课件
开课前的一些讲话: 一.大家晚上好,首先非常的荣幸能够在网易云平台开设讲解Python的这门课程,我也是第一次讲解哦,下面说说我讲解课程的原因,1.因为我发现市场上讲解Python的课程很多,不过,大 ...
- Python 3标准库 第十一章 网路通信
网路通信11.1 ipaddress : Internet 地址 ipaddress模块提供了处理IPv4和IPv6 11.1.2 网络 CMDB 11.2 socket:网络通信 11.2. ...
- Python 3标准库 第五章 数学运算
第五章数学运算-----------------------上下文解释:编程时,我们一般也是先给程序定义一些前提(环境变量.描述环境变化的全局变量等),这些“前提”就是上文,然后再编写各功能模块的代码 ...
- Python 3标准库第三章
时间过得很快,又是一周过去了,今天感觉迷迷糊糊的,不在状态,然后,下面开始我们的讲解,还是跟大家分享一下我自己的一些想法,第一.怎么讲了,就是各位如果有怀才不遇的想法,我感觉最好不要有这种想法;第二. ...
- Python 3标准库 第十四章 应用构建模块
Python 3标准库 The Python3 Standard Library by Example -----------------------------------------第十四章 ...
- 【python】标准库的大致认识
正如那句 Python 社区中很有名的话所说的:“battery included”,Python 的一大好处在于它有一套很有用的标准库(standard library).标准库是随着 Python ...
随机推荐
- UniEAP V4 WorkShop用户手册
版权声明<UniEAP V4 WorkShop用户手册>的版权归东软集团(大连)有限公司所有.未经东软集团(大连)有限公司的书面准许,不得将本手册的任何部分以任何形式.采用任何手段(电子的 ...
- CTF—攻防练习之HTTP—SQl注入(get)
攻击机:192.168.32.152 靶机 :192.168.32.157 扫描靶机扫端口: 开放了ssh和80看下ssh版本有没有漏洞,searchsplot下,没有发现 dirb扫描下目录,有个a ...
- Linux字符界面字符颜色显示
一.字符颜色 #!/bin/bash #字符颜色显示 #-e:允许echo使用转义 #\033[:开始位 #\033[0m:结束位 #\033等同于\e echo -e "\033[30m黑 ...
- AGC035 B - Even Degrees【思维·树形结构的妙用】
题目传送门 一句话题意: 首先,每一条边会产生1个入度,1个出度,因此,如果边的数量是奇数的话,图的所有节点的总出度就是奇数,不可能每个节点的出度都是偶数,因此无解. 有解时,我们先找出原图中的一棵生 ...
- 【神经网络与深度学习】【python开发】caffe-windows使能python接口使用draw_net.py绘制网络结构图过程
[神经网络与深度学习][python开发]caffe-windows使能python接口使用draw_net.py绘制网络结构图过程 标签:[神经网络与深度学习] [python开发] 主要是想用py ...
- css 命名 有的加# ,有的加点 ,有的没加。请问下都在什么情况下用的?
[nav{}]这样的样式是给特定的标签直接定义样式时使用的,这个样式名称是跟标签是相对应的,比如我要给<p></p>这个标签设置样式,那我就可以直接写:p{样式}就可以,但是这 ...
- PMP项目正常估算时间
最佳时间段+正常时间段*+最差时间段)/=正常估算时间. 项目经理小李对某活动工期进行估算时,发现人员的熟练程度和设备供应是否及时对工期至关重要.如果形成最有利组合时,预计17天可以完成:如果形成最不 ...
- C语言作业Ⅰ12
一.我学到的内容 二.我的收获 时间 作业链接 我的收获 第一周 https://www.cnblogs.com/deng9/p/11576196.html#4369234 让我对这个专业有了新的认识 ...
- spring boot-17.RabbitMQ
1.JMS&AMQP JMS(Java MessageService)实际上是指JMS API.JMS是由Sun公司早期提出的消息标准,旨在为java应用提供统一的消息操作,包括create. ...
- nodejs 和 js
JavaScript组成:ECMAScript(定义这门语言的基础,比如语法.数据类型.结构以及一些内置对象等).DOM(基于ECMASCRIPT,扩展出来的用于操作页面元素的方法).BOM(基于EC ...