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 ...
随机推荐
- hibernate 事务处理
Hibernate的事务处理:事务:* 事务就是逻辑上的一组操作,要么全都成功,要么全都失败!!! 事务特性:* 原子性:事务一组操作不可分割.* 一致性:事务的执行前后,数据完整性要保持一致.* 隔 ...
- 基于element表格的合并多个行实例
官方示例地址:https://github.liubing.me/lb-element-table/zh/guide/ 效果图: 0.下载lb-table 并引入 import LbTable fro ...
- 深入理解java:2.3.6. 并发编程concurrent包 之管理类---线程池
我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁 ...
- [JS] 点击按钮触发后台事件前,弹出确认框
只需要在button中设置onclick属性触发事件即可 下面以ASP.NET代码为例, ASP.NET中按钮客户端触发js代码的属性是OnClientClick <asp:Button ID= ...
- 头大!RabbitMQ 和 Kafka 到底怎么选?
前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措. 对于RabbitMQ和Kafka,到底应该选哪个? Rabb ...
- Python 之父 63 岁才退休,我 23 就中年危机。。
Java技术栈 www.javastack.cn 优秀的Java技术公众号 Python 之父 Guido van Rossum 在推特公布了自己从 Dropbox 公司离职的消息,并表示已经退休. ...
- PostgreSQL-UNION与Order by 冲突
问题描述 union 连接的两个sql 都包含 order SELECT <property1>, <property2> FROM <table1> ORDER ...
- php点击链接直接下载文件写法
down.php <?php $file = "avater.jpg"; //计算机上的一个文件 $fileName = basename($file); //获取文件名 h ...
- spring boot 是如何利用jackson进行反序列化的?
以下面的代码为例: @RestController public class HelloController { @RequestMapping("/") public BillS ...
- 5.jQuery之栏切换
<style> * { margin: 0; padding: 0; } li { list-style-type: none; } .tab { width: 978px; margin ...