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 ...
随机推荐
- vue按需引入Element UI的方法
在我们的实际项目开发中,多数是采用按需引入的模式来进行开发的,那么具体应该如何操作呢,可能会有许多新人傻傻分不清楚,具体将在下文讲到. 首先我们先vue create demo创建一个项目出来此时我们 ...
- 剑指Offer总结——用两个栈实现队列
class Solution { public: void push(int node) { stack2.push(node); } int pop() { if(stack1.empty()){ ...
- 【推荐算法工程师技术栈系列】程序语言--Java
目录 JDK 初步 ArrayList LinkedList Vector Stack HashMap Hashtable LinkedHashMap TreeMap HashSet LinkedHa ...
- TCP中三次挥手四次握手
1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...
- python 并发编程 多线程 目录
线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...
- windows编程 使用C++实现多线程类
有时候我们想在一个类中实现多线程,主线程在某些时刻获得数据,可以“通知”子线程去处理,然后把结果返回.下面的实例是主线程每隔2s产生10个随机数,将这10随机数传给多线程类,让它接收到数据后马上打印出 ...
- python中self与__init__怎么解释能让小白弄懂?
python中self与__init__怎么解释能让小白弄懂? 这个问题其实没那么简单. 只说一下自己的理解. python 里所有的 object 都有三个属性, 标识(identity), 类型( ...
- luoguP4578_ [FJOI2018]所罗门王的宝藏
题意 一个n*m的矩阵,初始值全为0,每一行每一列操作一次可以加1或者减1,问能否操作得到给定矩阵. 分析 行和列的分别的加减是可以相互抵消的,因此我们只需要考虑行的加和列的减. 对于给定矩阵每一个数 ...
- Jpa 重写方言dialect 使用oracle / mysql 数据库自定义函数
在使用criteria api进行查询时 criteriaBuilder只提供了一个部分标准的sql函数,但当我们需要使用oracle特有的行转列函数wm_concat或 mysql特有的行转列函数g ...
- 运维ipvsadm配置负载均衡
一.负载均衡LVS基本介绍 LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(r ...