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 ...
随机推荐
- 接口自动化-python unittest+requests+HTMLrunner
从2015年毕业入行软件测试,快满4年了,之前技术分享都在百度贴吧上面,现在正式开始在博客中记录工作技术,努力成长,加油 接口测试的步骤1.组装好该接口需要的参数数据2.使用get或post附带参数数 ...
- 红帽学习笔记[RHCSA] 第十课[计划任务Cron与At、逻辑卷管理]
计划任务[At & Cron Jobs] at # at 命令只能计划一次性任务但是比较方便. # 先输入时间 [root@localhost Desktop]# at 10:02 # 输入要 ...
- 反复横跳的瞄准线!从向量计算说起!基于射线检测的实现!Cocos Creator!
最近有小伙伴问我瞄准线遇到各种形状该怎么处理?如何实现反复横跳的瞄准线?最近刚好在<Cocos Creator游戏开发实战>中看到物理系统有一个射线检测,于是,基于这个射线检测,写了一个反 ...
- A9-USART2_RX_BUF 串口2收发异常
a9_send_cmd(); //退出透传模式,和前一次发送时间超过 2 秒,输入+++,就可以退出透传模式 delay_ms(); delay_ms(); delay_ms(); a9_quit_t ...
- Hbase 三维存储
hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储. 1.row ...
- mysql中char,varchar与text类型的区别
关于char,varchar与text平时没有太在意,一般来说,可能现在大家都是用varchar.但是当要存储的内容比较大时,究竟是选择varchar还是text呢?不知道...... text ...
- python中的元类介绍
类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段,在python中也是成立的. class ObjectCreator: pass my_object = ObjectCre ...
- sys模块&json模块&pickle模块
sys模块&json模块&pickle模块 sys模块 一.导入方式 import sys 二.作用 与Python解释器交互 三.模块功能 3.1 经常使用 sys.path #返回 ...
- Git-版本控制 (二)
昨天我们成功安装了Git,并且成功配置了环境变量~如果想看之前步骤的童鞋,请戳这里Git-版本控制(一) 今天我们要做的事情是:创建版本库. (觉得非高大尚的童鞋举个爪子 = . =) en~~~~ ...
- css3的calc属性不生效问题
css3的 calc:计算属性.由于自己做的项目中这个属性不常用到,偶尔用一次还没效果. 后来研究了下是因为运算符两边没加空格. 错误示例:.content{width:calc(100%-50px) ...