2015-11-26 75 views
0

我碰到了StackOverflow中的一段代碼,它提出了關於deque工作方式的兩個問題。我沒有足夠的聲譽問「原位」,因此這個問題:python deque瞭解

from collections import deque 
from itertools import islice 

def sliding_window(iterable, size=2, step=1, fillvalue=None): 
    if size < 0 or step < 1: 
     raise ValueError 
    it = iter(iterable) 
    q = deque(islice(it, size), maxlen=size) 
    if not q: 
     return # empty iterable or size == 0 
    q.extend(fillvalue for _ in range(size - len(q))) # pad to size 
    while True: 
     yield iter(q) # iter() to avoid accidental outside modifications 
     q.append(next(it)) 
     q.extend(next(it, fillvalue) for _ in range(step - 1)) 

的代碼計算給定大小的滑動窗口上的序列。 我不明白的步驟是第一:

q = deque(islice(it, size), maxlen=size) 

什麼用的maxlen這裏?是不是islice總是會輸出一個長度至多爲size的迭代器?

其次:

yield iter(q) # iter() to avoid accidental outside modifications 

爲什麼我們需要轉變到以可迭代,以避免「意外之外的修改」?

回答

0

要回答問題的第二部分,Python中的所有內容都通過引用傳遞。所以在以上情況下發生器q是由原函數引用deque hold,所以任何可能修改deque的方法都會破壞該代的原始算法。當你圍繞qiter()你實際上已經產生了一個迭代器。你可以從迭代器中讀取元素(讀取),但是你不能自己修改元素或者修改它們的順序(不允許寫入)。所以這是一個很好的做法,以防止容器內部發生器意外損壞。

+0

這很有用,非常感謝! – emanjavacas

0

要回答您的問題的第一部分,設置maxlen將使添加項不會超過該尺寸 - 舊項目將被丟棄。

+0

哦,當然,沒錯,那不是我最好的一天 – emanjavacas