summaryrefslogtreecommitdiffstats
path: root/Doc/lib/libitertools.tex
diff options
context:
space:
mode:
authorThomas Wouters <thomas@python.org>2006-04-21 10:40:58 (GMT)
committerThomas Wouters <thomas@python.org>2006-04-21 10:40:58 (GMT)
commit49fd7fa4431da299196d74087df4a04f99f9c46f (patch)
tree35ace5fe78d3d52c7a9ab356ab9f6dbf8d4b71f4 /Doc/lib/libitertools.tex
parent9ada3d6e29d5165dadacbe6be07bcd35cfbef59d (diff)
downloadcpython-49fd7fa4431da299196d74087df4a04f99f9c46f.zip
cpython-49fd7fa4431da299196d74087df4a04f99f9c46f.tar.gz
cpython-49fd7fa4431da299196d74087df4a04f99f9c46f.tar.bz2
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
number of tests, all because of the codecs/_multibytecodecs issue described here (it's not a Py3K issue, just something Py3K discovers): http://mail.python.org/pipermail/python-dev/2006-April/064051.html Hye-Shik Chang promised to look for a fix, so no need to fix it here. The tests that are expected to break are: test_codecencodings_cn test_codecencodings_hk test_codecencodings_jp test_codecencodings_kr test_codecencodings_tw test_codecs test_multibytecodec This merge fixes an actual test failure (test_weakref) in this branch, though, so I believe merging is the right thing to do anyway.
Diffstat (limited to 'Doc/lib/libitertools.tex')
-rw-r--r--Doc/lib/libitertools.tex27
1 files changed, 25 insertions, 2 deletions
diff --git a/Doc/lib/libitertools.tex b/Doc/lib/libitertools.tex
index 421d647..20bbc8d 100644
--- a/Doc/lib/libitertools.tex
+++ b/Doc/lib/libitertools.tex
@@ -276,12 +276,30 @@ by functions or loops that truncate the stream.
def izip(*iterables):
iterables = map(iter, iterables)
while iterables:
- result = [i.next() for i in iterables]
+ result = [it.next() for it in iterables]
yield tuple(result)
\end{verbatim}
\versionchanged[When no iterables are specified, returns a zero length
- iterator instead of raising a TypeError exception]{2.4}
+ iterator instead of raising a \exception{TypeError}
+ exception]{2.4}
+
+ Note, the left-to-right evaluation order of the iterables is guaranteed.
+ This makes possible an idiom for clustering a data series into n-length
+ groups using \samp{izip(*[iter(s)]*n)}. For data that doesn't fit
+ n-length groups exactly, the last tuple can be pre-padded with fill
+ values using \samp{izip(*[chain(s, [None]*(n-1))]*n)}.
+
+ Note, when \function{izip()} is used with unequal length inputs, subsequent
+ iteration over the longer iterables cannot reliably be continued after
+ \function{izip()} terminates. Potentially, up to one entry will be missing
+ from each of the left-over iterables. This occurs because a value is fetched
+ from each iterator in-turn, but the process ends when one of the iterators
+ terminates. This leaves the last fetched values in limbo (they cannot be
+ returned in a final, incomplete tuple and they are cannot be pushed back
+ into the iterator for retrieval with \code{it.next()}). In general,
+ \function{izip()} should only be used with unequal length inputs when you
+ don't care about trailing, unmatched values from the longer iterables.
\end{funcdesc}
\begin{funcdesc}{repeat}{object\optional{, times}}
@@ -517,4 +535,9 @@ def pairwise(iterable):
pass
return izip(a, b)
+def grouper(n, iterable, padvalue=None):
+ "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
+ return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)
+
+
\end{verbatim}