Python数据模型

collections

collections是Python内建的一个集合模块,提供了许多有用的集合类。

namedtuple

具名元组,tuple的一个子类。能够用来创建类似于tuple的数据类型,除了能够用索引来访问数据,能够迭代,更能够方便的通过属性名来访问数据。类似于tuplenamedtuple的属性也是不可改变的。

1
2
3
4
5
6
from collections import namedtuple

Card = collections.namedtuple('Card', ['rand', 'suit'])

beer_card = Card('7', 'diamonds')
print(beer_card.rand, beer_card[0])

deque

deque是高效实现了插入和删除操作的双向列表,适合用于队列和栈。相较而言list可以按索引快速访问元素,但是插入和删除元素则很慢,因为list是现行存储,数据量大的时候,插入和删除效率很低。

1
2
3
4
5
6
7
8
from collections import deque

sq = deque([str(x) for x in range(10)])

sq.append('x') //入栈 or 入队
sq.pop() //出栈
sq.appendleft('y')
sq.popleft() //出队

defaultdict

安全的字典。使用dict时,如果引用的key不存在,则会抛出KeyError,如果希望key不存在时不抛出Error而是返回一个默认值,则可以使用deafultdict

1
2
3
4
5
6
7
from collections import defaultdict

dedict = defaultdict({'key':'value'},lambda: 'not found')

dedict['key'] = 'value'
dedict['key']
dedict['nokey']

OrderedDict

dict中,key是无序的,所以当我们对dict做迭代时顺序是不确定的。当我们需要一个确定的顺序时可以使用OrderedDictOrderedDictkey的排序是按照插入顺序排序。

Counter

Counter是一个简单的计数器,并且只存储次数大于一的元素,否则可以访问,但是不存储。

1
2
3
4
5
6
7
8
from collections import Counter

c = Counter()
c['d']

for str in 'mycounter':
c[str] += 1
c

特殊方法

通常我们无需直接使用特殊方法,直接调用特殊方法的频率应该远远低于我们去实现他们的次数。通过内置函数(例如leniterstr,等等)来使用特殊方法是最好的选择。这些内置函数不仅会调用特殊方法,通常还提供额外的好处,而且对于内置的类来说,他们的速度更快。 ————《Fluent Python》

__getitem__

__getitem__方法的实现使得我们可以像p[key]这样来取值。并且我们通过索引来访问元素时也是使用了__getitem__方法。

__len__

当我们使用len(obj)函数来获取一个对象的长度时,便是调用了__len__方法。

__repr__ or __str__

简单来说这两个方法都是用于显示的,但是__str__是面向用户的,__repr__是面向程序员的。
在使用str()或者是print()时候会首先调用__str__方法,并且这种方法返回的字符串对终端用户更友好。在没有实现__str__方法时,两个函数回去调用__repr__方法。如果两个方法二选一去实现,显而易见后者是我们的选择。

__enter__ and __exit__

用于上下文管理,简单讲解见这里

附录

  • 跟运算符无关的特殊方法
    picture
  • 根运算符相关的特殊方法
    picture

Others

其他的特殊方法还有很多,与以上集中特殊方法各有异同,能力有限,时间有限不做过度描述。

本文标题:Python数据模型

文章作者:Darren

发布时间:2018年09月07日 - 23:09

最后更新:2018年09月08日 - 00:09

原始链接:http://Darren2017.github.io/2018/09/07/Python数据模型/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。