summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2003-06-18 19:25:37 (GMT)
committerRaymond Hettinger <python@rcn.com>2003-06-18 19:25:37 (GMT)
commitbefa37dd05050ecce9637d81ebe9d8d74688129c (patch)
tree904725503d82dda010c10fecb8bb6327d98c9c4d
parent3a8fbe7eeca4cc8cb944c8120690e54a6c775747 (diff)
downloadcpython-befa37dd05050ecce9637d81ebe9d8d74688129c.zip
cpython-befa37dd05050ecce9637d81ebe9d8d74688129c.tar.gz
cpython-befa37dd05050ecce9637d81ebe9d8d74688129c.tar.bz2
Minor updates:
* Updated comment on design of imap() * Added untraversed object in izip() structure * Replaced the pairwise() example with a more general window() example
-rw-r--r--Doc/lib/libitertools.tex15
-rw-r--r--Lib/test/test_itertools.py19
-rw-r--r--Modules/itertoolsmodule.c16
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;
}