tee 函数类似于我们熟知的细胞分裂
tee 函数类似于我们熟知的细胞分裂,它能复制原迭代器 n 个,原型如下:
tee(iterable, n=2)
应用如下,可以看出复制出的两个迭代器是独立的
a = tee([1,4,6,4,1],2)
In [51]: next(a[0])
Out[51]: 1
In [52]: next(a[1])
Out[52]: 1
实现它的代码大概如下:
def tee(iterable, n=2):
it = iter(iterable)
deques = [collections.deque() for i in range(n)]
def gen(mydeque):
while True:
if not mydeque:
try:
newval = next(it)
except StopIteration:
return
for d in deques:
d.append(newval)
yield mydeque.popleft()
return tuple(gen(d) for d in deques)
tee 实现内部使用一个队列类型 deques,起初生成空队列,向复制出来的每个队列中添加元素 newval, 同时 yield 当前被调用的 mydeque 中的最左元素。
map 变体
starmap 可以看做是 map 的变体,它能更加节省内存,同时 iterable 的元素必须也为可迭代对象,原型如下:
starmap(function, iterable)
应用它:
In [63]: list(starmap(lambda x,y: str(x)+’-‘+str(y), [(‘a’,1),(‘b’,2),(‘c’,3)]))
Out[63]: [‘a-1’, ‘b-2’, ‘c-3’]
starmap 的实现细节如下:
def starmap(function, iterable):
for args in iterable:
yield function(*args)