この節では、既存の 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=bool):
"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=bool):
"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=bool):
"Returns True if pred(x) is False for every element in the iterable"
return True not in imap(pred, seq)
def quantify(seq, pred=bool):
"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)