Python 库、技巧

一、namedtuple:用于构建只有少数属性但无方法的对象

>>> from collections import namedtuple
>>> Card = namedtuple('Card', ['rank', 'suit'])
>>> card = Card(5, 'hearts')
>>> card
Card(rank=5, suit='hearts')

二、bisect:可迭代对象中的插入与查找

import bisect
>>> li
[26, 27, 40, 50, 53, 59, 70, 80, 87, 97]
# 使用bisect的前提是列表有序
# bisect 主要有两个函数,在不破坏已有排序下,insort 插入与 bisect 寻找插入位置
>>> bisect.insort(li, 30)    
>>> li
[26, 27, 30, 40, 50, 53, 59, 70, 80, 87, 97]
>>> bisect.bisect(li, 35)
3
# 类似的还有 bisect_left、bisect_rigth,insort_left、insort_right
>>> bisect.bisect_left(li, 30)
2
>>> bisect.bisect_right(li, 30)
3
>>> bisect.bisect(li, 30)   # 即 bisect 赞同于 bisect_right
3

三、内容视图

  • 不复制内容,在数据结构之间共享内存
>>> numbers = array('h', [-2, -1, 0, 1, 2])
>>> numbers
array('h', [-2, -1, 0, 1, 2])
>>> memv = memoryview(numbers)
>>> len(memv)
5
>>> memv[0]
-2
>>> memv_oct = memv.cast('B')  # 转化为'B'类型(无符号字符)
>>> memv_oct
0x0000000002EB7DC8>
>>> memv_oct.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
>>> memv_oct[5] = 4
# 因把2个字节的整数的高位字改成4,有符号整数的值就变成了1024
>>> numbers
array('h', [-2, -1, 1024, 1, 2])

三、部分情况下列表的替代

  • 若仅处理数字,数组更为合适。数组支持可变对象的 pop、insert、extend 等方法,同时还提供文件读取更快的方法,如 frombytes、tofile
  • 内容视图:不复制内容,在数据结构之间共享内存
  • 若为首尾插入操作较多,可考虑使用双向队列(collections.deque)
    1. 双向队列对两边操作会更快,但对中间元素操作会更慢
    2. append 和 popleft 均为原子操作,在多线程中也可安全操作,无需担心资源锁的问题
>>> from collections import deque
>>> dq = deque(range(10), maxlen=10)
>>> dq
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
# rotate 可将首尾 n 个元素进行移动
>>> dq.rotate(3)    # n>0,右端左移
>>> dq
deque([7, 8, 9, 0, 1, 2, 3, 4, 5, 6], maxlen=10)
>>> dq.rotate(-3)   # n<0,左端右移
>>> dq
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
# append 及 extend 均为尾部操作,appendleft 与 extendleft 对首部操作
# 当插入的元素操作队列长度时,多出的元素会被删除
>>> dq.appendleft(-1)
>>> dq
deque([-1, 0, 1, 2, 3, 4, 5, 6, 7, 8], maxlen=10)
>>> dq.extend([11,22,33])
>>> dq
deque([2, 3, 4, 5, 6, 7, 8, 11, 22, 33], maxlen=10)

你可能感兴趣的:(python)