2015-11-26 3 views
0

Я натолкнулся на код в StackOverflow, который поднял два вопроса о том, как работает deque. Я не хватает репутации, чтобы спросить «на месте», поэтому этот вопрос:python deque understanding

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, нарушит оригинальный алгоритм генерации. Когда вы окружаете q с iter(), то, что вы эффективно дали, является итератором. Вы можете взять элементы из итератора (read), но вы не можете сами изменить элементы или изменить их последовательность (писать не разрешено). Поэтому хорошей защитой от случайного повреждения контейнера является генератор.

+0

Это было полезно, спасибо большое! – emanjavacas

0

Чтобы ответить на первую часть вашего вопроса, установка maxlen заставит deque не превышать этот размер при добавлении элементов - старые элементы будут отброшены.

+0

О, конечно, это верно, это был не мой лучший день – emanjavacas