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 ...
随机推荐
- Golang基础(7):go的net/rpc用法
一:PRC是什么? RPC(Remote Procedure Call) 远程过程调用,是一个计算通信协议.该协议允许一台计算机上的程序调用另外一台计算机上的程序.远程过程调用就是2个不在同一台计算机 ...
- python基础-输出
输出helloworld语句 print('helloworld') 换行操作 print('helloworld',‘hellodarling’)
- linux free 命令 查看内存使用情况
查看Linux服务器下的内存使用情况,可以使用命令free -m [root@localhost ~]$ free // 以KB为单位显示内存使用情况 [root@localhost ~]$ free ...
- python 并发编程 同步调用和异步调用 回调函数
提交任务的两张方式: 1.同步调用 2.异步调用 同步调用:提交完任务后,就在原地等待任务执行完后,拿到结果,再执行下一行代码 同步调用,导致程序串行执行 from concurrent.future ...
- Python新手练手项目
1.新手练手项目集中推荐 https://zhuanlan.zhihu.com/p/22164270 2.Python学习网站 https://www.shiyanlou.com 3.数据结构可视化学 ...
- Leetcode 38.报数 By Python
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作 "one 1" ...
- 更新到.netcore3.0后找不到dotnet-ef的解决办法
在项目根目录下建立global.json文件 { "sdk": { "version": "2.2.402" } } 或使用命令 dotne ...
- form表单添加富文本编辑器
<div class="control-group"> <label class="control-label">内容:</lab ...
- [转载]Linux运行模式及紧急、救援模式
运行模式 在Linux中,存在一个叫init(initialize)的进程,其进程号是1,该进程存在一个对应的配置文件inittab,叫做系统的运行级别配置文件,位置在/etc/inittab.(但是 ...
- linux复习4:文件和目录
7一.linux文件 1.linux文件的扩展名:文件扩展名是文件名最后一个点之后的部分,下面列出了其中一部分 (1)压缩文件和归档文件 压缩和归档的文件扩展名及其含义如下. .bz2:使用bzip2 ...