Clean-up itertools docs and recipes.

This commit is contained in:
Raymond Hettinger 2008-07-19 23:58:47 +00:00
parent 39e0eb766f
commit f1f46f0350
2 changed files with 33 additions and 98 deletions

View File

@ -35,18 +35,11 @@ equivalent result.
Likewise, the functional tools are designed to work well with the high-speed
functions provided by the :mod:`operator` module.
The module author welcomes suggestions for other basic building blocks to be
added to future versions of the module.
Whether cast in pure python form or compiled code, tools that use iterators are
more memory efficient (and faster) than their list based counterparts. Adopting
more memory efficient (and often faster) than their list based counterparts. Adopting
the principles of just-in-time manufacturing, they create data when and where
needed instead of consuming memory with the computer equivalent of "inventory".
The performance advantage of iterators becomes more acute as the number of
elements increases -- at some point, lists grow large enough to severely impact
memory cache performance and start running slowly.
.. seealso::
@ -598,55 +591,35 @@ which incur interpreter overhead.
.. testcode::
def take(n, seq):
return list(islice(seq, n))
def take(n, iterable):
"Return first n items of the iterable as a list"
return list(islice(iterable, n))
def enumerate(iterable):
return izip(count(), iterable)
def enumerate(iterable, start=0):
return izip(count(start), iterable)
def tabulate(function):
def tabulate(function, start=0):
"Return function(0), function(1), ..."
return imap(function, count())
def iteritems(mapping):
return izip(mapping.iterkeys(), mapping.itervalues())
return imap(function, count(start))
def nth(iterable, n):
"Returns the nth item or raise StopIteration"
return islice(iterable, n, None).next()
"Returns the nth item or empty list"
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 quantify(iterable, pred=bool):
"Count how many times the predicate is true"
return sum(imap(pred, iterable))
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"
for elem in ifilter(pred, seq):
return False
return True
def quantify(seq, pred=None):
"Count how many times the predicate is true in the sequence"
return sum(imap(pred, seq))
def padnone(seq):
def padnone(iterable):
"""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))
return chain(iterable, repeat(None))
def ncycles(seq, n):
def ncycles(iterable, n):
"Returns the sequence elements n times"
return chain.from_iterable(repeat(seq, n))
return chain.from_iterable(repeat(iterable, n))
def dotproduct(vec1, vec2):
return sum(imap(operator.mul, vec1, vec2))

View File

@ -1185,52 +1185,32 @@ Samuele
[22]
[25, 26, 27, 28]
>>> def take(n, seq):
... return list(islice(seq, n))
>>> def take(n, iterable):
... "Return first n items of the iterable as a list"
... return list(islice(iterable, n))
>>> def enumerate(iterable):
... return izip(count(), iterable)
>>> def enumerate(iterable, start=0):
... return izip(count(start), iterable)
>>> def tabulate(function):
>>> def tabulate(function, start=0):
... "Return function(0), function(1), ..."
... return imap(function, count())
>>> def iteritems(mapping):
... return izip(mapping.iterkeys(), mapping.itervalues())
... return imap(function, count(start))
>>> def nth(iterable, n):
... "Returns the nth item"
... "Returns the nth item or empty list"
... 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 quantify(iterable, pred=bool):
... "Count how many times the predicate is true"
... return sum(imap(pred, iterable))
>>> 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"
... for elem in ifilter(pred, seq):
... return False
... return True
>>> def quantify(seq, pred=None):
... "Count how many times the predicate is true in the sequence"
... return sum(imap(pred, seq))
>>> def padnone(seq):
>>> def padnone(iterable):
... "Returns the sequence elements and then returns None indefinitely"
... return chain(seq, repeat(None))
... return chain(iterable, repeat(None))
>>> def ncycles(seq, n):
... "Returns the sequence elements n times"
... return chain(*repeat(seq, n))
>>> def ncycles(iterable, n):
... "Returns the seqeuence elements n times"
... return chain(*repeat(iterable, n))
>>> def dotproduct(vec1, vec2):
... return sum(imap(operator.mul, vec1, vec2))
@ -1315,24 +1295,6 @@ perform as purported.
>>> nth('abcde', 3)
['d']
>>> all([2, 4, 6, 8], lambda x: x%2==0)
True
>>> all([2, 3, 6, 8], lambda x: x%2==0)
False
>>> any([2, 4, 6, 8], lambda x: x%2==0)
True
>>> any([1, 3, 5, 9], lambda x: x%2==0,)
False
>>> no([1, 3, 5, 9], lambda x: x%2==0)
True
>>> no([1, 2, 5, 9], lambda x: x%2==0)
False
>>> quantify(xrange(99), lambda x: x%2==0)
50