collections
collections
是Python内建的一个集合模块,提供了许多有用的集合类。
namedtuple
具名元组,tuple
的一个子类。能够用来创建类似于tuple
的数据类型,除了能够用索引来访问数据,能够迭代,更能够方便的通过属性名来访问数据。类似于tuple
,namedtuple
的属性也是不可改变的。
1 | from collections import namedtuple |
deque
deque
是高效实现了插入和删除操作的双向列表,适合用于队列和栈。相较而言list
可以按索引快速访问元素,但是插入和删除元素则很慢,因为list
是现行存储,数据量大的时候,插入和删除效率很低。
1 | from collections import deque |
defaultdict
安全的字典。使用dict
时,如果引用的key
不存在,则会抛出KeyError
,如果希望key
不存在时不抛出Error
而是返回一个默认值,则可以使用deafultdict
1 | from collections import defaultdict |
OrderedDict
在dict
中,key
是无序的,所以当我们对dict
做迭代时顺序是不确定的。当我们需要一个确定的顺序时可以使用OrderedDict
。OrderedDict
中key
的排序是按照插入顺序排序。
Counter
Counter
是一个简单的计数器,并且只存储次数大于一的元素,否则可以访问,但是不存储。
1 | from collections import Counter |
特殊方法
通常我们无需直接使用特殊方法,直接调用特殊方法的频率应该远远低于我们去实现他们的次数。通过内置函数(例如
len
、iter
、str
,等等)来使用特殊方法是最好的选择。这些内置函数不仅会调用特殊方法,通常还提供额外的好处,而且对于内置的类来说,他们的速度更快。 ————《Fluent Python》
__getitem__
__getitem__
方法的实现使得我们可以像p[key]
这样来取值。并且我们通过索引来访问元素时也是使用了__getitem__
方法。
__len__
当我们使用len(obj)
函数来获取一个对象的长度时,便是调用了__len__
方法。
__repr__
or __str__
简单来说这两个方法都是用于显示的,但是__str__
是面向用户的,__repr__
是面向程序员的。
在使用str()
或者是print()
时候会首先调用__str__
方法,并且这种方法返回的字符串对终端用户更友好。在没有实现__str__
方法时,两个函数回去调用__repr__
方法。如果两个方法二选一去实现,显而易见后者是我们的选择。
__enter__
and __exit__
用于上下文管理,简单讲解见这里。
附录
- 跟运算符无关的特殊方法
- 根运算符相关的特殊方法
Others
其他的特殊方法还有很多,与以上集中特殊方法各有异同,能力有限,时间有限不做过度描述。