Minor updates:

* Updated comment on design of imap()
* Added untraversed object in izip() structure
* Replaced the pairwise() example with a more general window() example
This commit is contained in:
Raymond Hettinger 2003-06-18 19:25:37 +00:00
parent 3a8fbe7eec
commit befa37dd05
3 changed files with 38 additions and 12 deletions

View file

@ -358,10 +358,6 @@ from building blocks.
... "Returns True if pred(x) is False for every element in the iterable" ... "Returns True if pred(x) is False for every element in the iterable"
... return not nth(ifilter(pred, seq), 0) ... return not nth(ifilter(pred, seq), 0)
>>> def pairwise(seq):
... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
... return izip(seq, islice(seq,1,None))
>>> def padnone(seq): >>> def padnone(seq):
... "Returns the sequence elements and then returns None indefinitely" ... "Returns the sequence elements and then returns None indefinitely"
... return chain(seq, repeat(None)) ... return chain(seq, repeat(None))
@ -373,4 +369,15 @@ from building blocks.
>>> def dotproduct(vec1, vec2): >>> def dotproduct(vec1, vec2):
... return sum(imap(operator.mul, vec1, vec2)) ... return sum(imap(operator.mul, vec1, vec2))
>>> def window(seq, n=2):
... "Returns a sliding window (of width n) over data from the iterable"
... " s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... "
... it = iter(seq)
... result = tuple(islice(it, n))
... if len(result) == n:
... yield result
... for elem in it:
... result = result[1:] + (elem,)
... yield result
\end{verbatim} \end{verbatim}

View file

@ -427,10 +427,6 @@ Samuele
... "Returns True if pred(x) is False for every element in the iterable" ... "Returns True if pred(x) is False for every element in the iterable"
... return not nth(ifilter(pred, seq), 0) ... return not nth(ifilter(pred, seq), 0)
>>> def pairwise(seq):
... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
... return izip(seq, islice(seq,1,len(seq)))
>>> def padnone(seq): >>> def padnone(seq):
... "Returns the sequence elements and then returns None indefinitely" ... "Returns the sequence elements and then returns None indefinitely"
... return chain(seq, repeat(None)) ... return chain(seq, repeat(None))
@ -442,6 +438,16 @@ Samuele
>>> def dotproduct(vec1, vec2): >>> def dotproduct(vec1, vec2):
... return sum(imap(operator.mul, vec1, vec2)) ... return sum(imap(operator.mul, vec1, vec2))
>>> def window(seq, n=2):
... "Returns a sliding window (of width n) over data from the iterable"
... " s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... "
... it = iter(seq)
... result = tuple(islice(it, n))
... if len(result) == n:
... yield result
... for elem in it:
... result = result[1:] + (elem,)
... yield result
This is not part of the examples but it tests to make sure the definitions This is not part of the examples but it tests to make sure the definitions
perform as purported. perform as purported.
@ -473,9 +479,12 @@ True
>>> no(lambda x: x%2==0, [1, 2, 5, 9]) >>> no(lambda x: x%2==0, [1, 2, 5, 9])
False False
>>> list(pairwise('abc')) >>> list(window('abc'))
[('a', 'b'), ('b', 'c')] [('a', 'b'), ('b', 'c')]
>>> list(window('abc',5))
[]
>>> list(islice(padnone('abc'), 0, 6)) >>> list(islice(padnone('abc'), 0, 6))
['a', 'b', 'c', None, None, None] ['a', 'b', 'c', None, None, None]

View file

@ -882,7 +882,7 @@ the following reasons:
None. None.
4) If a need does arise, it can be met by __builtins__.map() or by 4) If a need does arise, it can be met by __builtins__.map() or by
writing a generator. writing: chain(iterable, repeat(None)).
5) Similar toolsets in Haskell and SML do not have automatic None fill-in. 5) Similar toolsets in Haskell and SML do not have automatic None fill-in.
*/ */
@ -1574,8 +1574,18 @@ izip_dealloc(izipobject *lz)
static int static int
izip_traverse(izipobject *lz, visitproc visit, void *arg) izip_traverse(izipobject *lz, visitproc visit, void *arg)
{ {
if (lz->ittuple) int err;
return visit(lz->ittuple, arg);
if (lz->ittuple) {
err = visit(lz->ittuple, arg);
if (err)
return err;
}
if (lz->result) {
err = visit(lz->result, arg);
if (err)
return err;
}
return 0; return 0;
} }