Перекрывающиеся круги в CSS с 1 div

Вот пример из модуля itertools docs:

import itertools
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)   

Для Python 2 вам нужно itertools.izip вместо zip:

import itertools
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.izip(a, b)

Как это работает:

Сначала создаются два параллельных итератора a и b (вызов tee()), оба указывающие на первый элемент исходного итерабельного. Второй итератор b перемещается на 1 шаг вперед (вызов next(b, None)). На этом этапе a указывает на s0 и b указывает на s1. И a, и b могут перемещаться по исходному итератору независимо друг от друга - функция izip принимает два итератора и создает пары возвращаемых элементов, продвигая оба итератора в одинаковом темпе.

Одно предупреждение: [tee() создает два итератора, которые могут продвигаться независимо друг от друга, но это связано с затратами. Если один из итераторов продвигается дальше другого, тогда tee() необходимо сохранить потребляемые элементы в памяти до тех пор, пока второй итератор не сравнит их (он не сможет «перемотать» исходный итератор). Здесь это не имеет значения, потому что один итератор только на шаг впереди другого, но в целом легко использовать много памяти.

И поскольку tee() может принимать n параметр, это также можно использовать для более чем двух параллельных итераторов:

def threes(iterator):
    "s -> (s0,s1,s2), (s1,s2,s3), (s2, s3,4), ..."
    a, b, c = itertools.tee(iterator, 3)
    next(b, None)
    next(c, None)
    next(c, None)
    return zip(a, b, c)

60
задан web-tiki 28 April 2016 в 09:31
поделиться