##
3 レシピ

この節では、既存の itertools をビルディングブロックとしてツールセットを 拡張するためのレシピを示します。

iterable 全体を一度にメモリ上に置くよりも、要素を一つづつ処理する方が メモリ効率上の有利さを保てます。関数形式のままツールをリンクしてゆくと、 コードのサイズを減らし、一時変数を減らす助けになります。 インタプリタのオーバヘッドをもたらす for ループやジェネレータを使わずに、 ``ベクトル化された'' ビルディングブロックを使うと、高速な処理を実現 できます。

    def take(n, seq):
        return list(islice(seq, n))

    def enumerate(iterable):
        return izip(count(), iterable)

    def tabulate(function):
        "Return function(0), function(1), ..."
        return imap(function, count())

    def iteritems(mapping):
        return izip(mapping.iterkeys(), mapping.itervalues())

    def nth(iterable, n):
        "Returns the nth item"
        return list(islice(iterable, n, n+1))

    def all(seq, pred=None):
        "Returns True if pred(x) is true for every element in the iterable"
        for elem in ifilterfalse(pred, seq):
            return False
        return True

    def any(seq, pred=None):
        "Returns True if pred(x) is true for at least one element in the iterable"
        for elem in ifilter(pred, seq):
            return True
        return False

    def no(seq, pred=None):
        "Returns True if pred(x) is false for every element in the iterable"
        return True not in imap(pred, seq)

    def quantify(seq, pred=None):
        "Count how many times the predicate is true in the sequence"
        return sum(imap(pred, seq))

    def padnone(seq):
        """Returns the sequence elements and then returns None indefinitely.

        Useful for emulating the behavior of the built-in map() function.
        """
        return chain(seq, repeat(None))

    def ncycles(seq, n):
        "Returns the sequence elements n times"
        return chain(*repeat(seq, n))

    def dotproduct(vec1, vec2):
        return sum(imap(operator.mul, vec1, vec2))

    def flatten(listOfLists):
        return list(chain(*listOfLists))

    def repeatfunc(func, times=None, *args):
        """Repeat calls to func with specified arguments.

        Example:  repeatfunc(random.random)
        """
        if times is None:
            return starmap(func, repeat(args))
        else:
            return starmap(func, repeat(args, times))

    def pairwise(iterable):
        "s -> (s0,s1), (s1,s2), (s2, s3), ..."
        a, b = tee(iterable)
        try:
            b.next()
        except StopIteration:
            pass
        return izip(a, b)

    def grouper(n, iterable, padvalue=None):
        "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
        return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)