summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2009-02-18 20:54:53 +0000
committerRaymond Hettinger <python@rcn.com>2009-02-18 20:54:53 +0000
commitc8223b09b0c457f764f93749d8af81a9b3f99317 (patch)
tree78cf838360bfb15980013283d7606e1afa5b4c4f
parent8367becc02316140d9f01261aec89567d0563e9f (diff)
downloadcpython-git-c8223b09b0c457f764f93749d8af81a9b3f99317.tar.gz
Generalize the itertools.tee() recipe.
-rw-r--r--Doc/library/itertools.rst48
1 files changed, 24 insertions, 24 deletions
diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst
index 64aa634a2b..6fa1978af8 100644
--- a/Doc/library/itertools.rst
+++ b/Doc/library/itertools.rst
@@ -137,7 +137,7 @@ loops that truncate the stream.
return
indices = range(r)
yield tuple(pool[i] for i in indices)
- while 1:
+ while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
@@ -187,7 +187,7 @@ loops that truncate the stream.
return
indices = [0] * r
yield tuple(pool[i] for i in indices)
- while 1:
+ while True:
for i in reversed(range(r)):
if indices[i] != n - 1:
break
@@ -610,28 +610,28 @@ loops that truncate the stream.
.. function:: tee(iterable[, n=2])
- Return *n* independent iterators from a single iterable. The case where ``n==2``
- is equivalent to::
-
- def tee(iterable):
- def gen(next, data={}):
- for i in count():
- if i in data:
- yield data.pop(i)
- else:
- data[i] = next()
- yield data[i]
- it = iter(iterable)
- return gen(it.next), gen(it.next)
-
- Note, once :func:`tee` has made a split, the original *iterable* should not be
- used anywhere else; otherwise, the *iterable* could get advanced without the tee
- objects being informed.
-
- Note, this member of the toolkit may require significant auxiliary storage
- (depending on how much temporary data needs to be stored). In general, if one
- iterator is going to use most or all of the data before the other iterator, it
- is faster to use :func:`list` instead of :func:`tee`.
+ Return *n* independent iterators from a single iterable. Equivalent to::
+
+ def tee(iterable, n=2):
+ it = iter(iterable)
+ deques = [collections.deque() for i in range(n)]
+ def gen(mydeque):
+ while True:
+ if not mydeque: # when the local deque is empty
+ newval = next(it) # fetch a new value and
+ for d in deques: # load it to all the deques
+ d.append(newval)
+ yield mydeque.popleft()
+ return tuple(gen(d) for d in deques)
+
+ Once :func:`tee` has made a split, the original *iterable* should not be
+ used anywhere else; otherwise, the *iterable* could get advanced without
+ the tee objects being informed.
+
+ This itertool may require significant auxiliary storage (depending on how
+ much temporary data needs to be stored). In general, if one iterator uses
+ most or all of the data before another iterator starts, it is faster to use
+ :func:`list` instead of :func:`tee`.
.. versionadded:: 2.4