最近在编码过程当中,发现collections库里提供了很是多有用的工具,能够优化编码风格,提高开发效率。node
下面是我结合本身开发和网上资料的一些总结。python
使用dict时,若是引用的Key不存在,就会抛出KeyError。若是但愿key不存在时,返回一个默认值,就能够用defaultdictbash
在没有接触到它以前,我在代码里常常使用setdafult来给字典设置初始值,但这样可读性很差,也不够优雅,好比这一段:app
for cate in res_service_category:
category_id = cate['id']
biz_service_category_mapping = self._service_category_data.setdefault(bk_biz_id, {})
biz_service_category_mapping[category_id] = cate
复制代码
若是用了defaultdict呢?是否是简洁多了。函数
self._service_category_data = defaultdict()
for cate in res_service_category:
category_id = cate['id']
biz_service_category_mapping = self._service_category_data[bk_biz_id]
biz_service_category_mapping[category_id] = cate
复制代码
众所周知,使用dict时,Key是无序的。在对dict作迭代时,咱们没法肯定Key的顺序。工具
若是要保持Key的顺序,能够用OrderedDict优化
nodes_category = OrderedDict([('ADD', []), ('REMOVE', []), ('RETRY', [])])
复制代码
这样在遍历该字典时,就能保证它的顺序了。编码
namedtuple是一个函数,它用来建立一个自定义的tuple对象,而且规定了tuple元素的个数,并能够用属性而不是索引来引用tuple的某个元素。spa
这样一来,咱们用namedtuple能够很方便地定义一种数据类型,它具有tuple的不变性,又能够根据属性来引用,使用十分方便。code
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2
复制代码
使用list存储数据时,按索引访问元素很快,可是插入和删除元素就很慢了,由于list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操做的双向列表,适合用于队列和栈
>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('x')
>>> q.appendleft('y')
>>> q
deque(['y', 'a', 'b', 'c', 'x'])
复制代码
我知道关于collections库的使用,对于不少python高手来讲,都已经得心应手了,根本不须要再读这一篇。我想表达的是,如何写出优雅的代码,或者写出精益求精的代码,须要有很长的路要走,并且这是一条无穷无尽的上升道路,而对于每一位coder,都走在属于本身的道路上。so,keep moving。