summaryrefslogtreecommitdiffstats
path: root/Doc/library
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2009-02-18 20:56:51 (GMT)
committerRaymond Hettinger <python@rcn.com>2009-02-18 20:56:51 (GMT)
commitcf984cee934dd5375596ca980fee45e1d943b9ef (patch)
tree2871194346b1eb09e9d04098893e891600226f1e /Doc/library
parent0654ccd1d23986accb99c69e84369b99f9cdc8e2 (diff)
downloadcpython-cf984cee934dd5375596ca980fee45e1d943b9ef.zip
cpython-cf984cee934dd5375596ca980fee45e1d943b9ef.tar.gz
cpython-cf984cee934dd5375596ca980fee45e1d943b9ef.tar.bz2
Generalize the itertools.tee() recipe.
Diffstat (limited to 'Doc/library')
-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 7fdadd2..491cb18 100644
--- a/Doc/library/itertools.rst
+++ b/Doc/library/itertools.rst
@@ -130,7 +130,7 @@ loops that truncate the stream.
return
indices = list(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
@@ -178,7 +178,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
@@ -501,28 +501,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`.
.. function:: zip_longest(*iterables[, fillvalue])