将序列分解为单独的变量

问题:将一个包含N个元素的元组或者序列分解为N个单独的变量

对于多余的变量我们可以选一个用不到的变量名

1
2
3
4
data = ["ACME", 50, 91.1, (2012, 12, 21)]
_, shares, price, _ = data
print("shares: " + str(shares))
print("price: " + str(price))
1
2
shares: 50
price: 91.1

实际上只要对象恰好可迭代的,那么就可以执行分解操作。这包含字符串、文件、迭代器、以及生成器。

从任意长度的可迭代对象中分解元素

问题:需要从某个可迭代对象中分解N个元素,但是这个可迭代对象的长度可能超过N,这会导致出现“分解的值过多(too many values to unpack)”的异常。

使用Python的“*表达式”可以用来解决这个问题。

例如,假设开设一门课程,并决定在期末的作业成绩中去掉第一个和最后一个,只对中间剩下的成绩做平均分统计。

1
2
3
def drop_first_last(grades):
first, *middle, last = grades
return avg(middle)

保留最后N个元素

问题:我们想在迭代或是其他形式的处理过程中,对最后几项记录做一个有限的历史记录。

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

q = deque(maxlen=3)
q.append(1)
q.append(2)
q.append(3)
print(q)
q.append(4)
print(q)
1
2
deque([1, 2, 3], maxlen=3)
deque([2, 3, 4], maxlen=3)

找到最大或最小的N个元素

问题:在某个集合中找出最大或最小的N个元素。

1
2
3
4
5
import heapq

nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
print(heapq.nlargest(3, nums))
print(heapq.nsmallest(3, nums))
1
2
[42, 37, 23]
[-4, 1, 2]