全书链接:https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html
最近在看这本书,感觉知识点挺丰富,结合个人理解和需要,整理并记录下学习点。
1.1 解压分解序列
通过赋值操作可以实现对可迭代对象的解压分解。
# 分解元组, 得到 x = 4, y = 5
x,y = (4,5)
# 分解列表
name, shares, price, date = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
# 分解字符串
a, b, c, d, e = 'Hello'
注意:被赋值变量个数与可迭代对象元素个数要匹配,否则会报错;若只想解压部分值赋值给变量,可采用如下方式:
data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
_, shares, price, _ = data
通过单下划线变量来占位,但最终这些变量会被丢掉不使用。
1.2 单星号标记变量
刚提到,若变量个数与可迭代对象元素个数不匹配会报错。倘若可迭代对象中元素个数过多,想提取的变量只有特定几个,该如何实现?
在要被赋值的变量前用单星号进行标记,表示该变量为可变变量,其被赋值内容将由其它变量赋值操作决定,剩余元素会以列表的形式赋值给该可变变量。
record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212')
name, email, *phone_numbers = record
# name = 'Dave'
# email = 'dave@example.com'
# phone_numbers = ['773-555-1212', '847-555-1212']
注意,星标的可变变量类型是列表,即使可迭代对象中对应的元素为空,也将以空列表的形式赋值给该变量。
1.3 固定大小的队列
collections 模块中的 deque(maxlen=N) 可以构造一个固定大小为 N 的队列,当第 N+1 个元素加入时,队列会移除队列中旧元素维持队列大小,在该队列两端插入或删除元素的时间复杂度都是 O(1)。
from collections import deque
q = deque(maxlen = 3)
q.append(1)
q.append(2)
q.append(3)
q.append(4)
q.append(5)
print(q)
# 输出:deque([3, 4, 5], maxlen=3)
该队列除了通过 append() 和 pop() 在尾端增删元素,还可以通过 appendleft(n) 和 popleft() 在队列开头增删元素。
# 左侧加入 100,得到 [100,3,4]
q.appendleft(100)
# 右侧移除一个元素,得到 [100,3]
q.pop()
# 左侧移除一个元素,得到[3]
q.popleft()
print(q)
# 输出:deque([3], maxlen=3)
注意,当队列已满时,通过 appendleft(n) 在队列左侧继续添加元素,则队列将会移除最右侧元素;若通过 append(n) 在最右侧添加元素时,则移除最左侧的元素。
该译本中的描述:“当新的元素加入并且这个队列已满的时候, 最老的元素会自动被移除掉”有误导,已经通过 GitHub Issue 进行反馈。