この節では、既存の 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)