From befa37dd05050ecce9637d81ebe9d8d74688129c Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 18 Jun 2003 19:25:37 +0000 Subject: Minor updates: * Updated comment on design of imap() * Added untraversed object in izip() structure * Replaced the pairwise() example with a more general window() example --- Doc/lib/libitertools.tex | 15 +++++++++++---- Lib/test/test_itertools.py | 19 ++++++++++++++----- Modules/itertoolsmodule.c | 16 +++++++++++++--- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/Doc/lib/libitertools.tex b/Doc/lib/libitertools.tex index f291fe3..e146c6c 100644 --- a/Doc/lib/libitertools.tex +++ b/Doc/lib/libitertools.tex @@ -358,10 +358,6 @@ from building blocks. ... "Returns True if pred(x) is False for every element in the iterable" ... 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): ... "Returns the sequence elements and then returns None indefinitely" ... return chain(seq, repeat(None)) @@ -373,4 +369,15 @@ from building blocks. >>> def dotproduct(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} diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index a4ad845..846a690 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -427,10 +427,6 @@ Samuele ... "Returns True if pred(x) is False for every element in the iterable" ... 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): ... "Returns the sequence elements and then returns None indefinitely" ... return chain(seq, repeat(None)) @@ -442,6 +438,16 @@ Samuele >>> def dotproduct(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 perform as purported. @@ -473,9 +479,12 @@ True >>> no(lambda x: x%2==0, [1, 2, 5, 9]) False ->>> list(pairwise('abc')) +>>> list(window('abc')) [('a', 'b'), ('b', 'c')] +>>> list(window('abc',5)) +[] + >>> list(islice(padnone('abc'), 0, 6)) ['a', 'b', 'c', None, None, None] diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 0a20c1b..fae4511 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -882,7 +882,7 @@ the following reasons: None. 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. */ @@ -1574,8 +1574,18 @@ izip_dealloc(izipobject *lz) static int izip_traverse(izipobject *lz, visitproc visit, void *arg) { - if (lz->ittuple) - return visit(lz->ittuple, arg); + int err; + + 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; } -- cgit v0.12