summaryrefslogtreecommitdiffstats
path: root/Doc/library/itertools.rst
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2010-03-28 18:02:41 (GMT)
committerRaymond Hettinger <python@rcn.com>2010-03-28 18:02:41 (GMT)
commit5b027f87b5d62943d858082c5af84ab0636c0881 (patch)
treef08b0a9a7494e28d78afed21e05bbc2ed97e350c /Doc/library/itertools.rst
parenta7e08fe3f88d116622fb0508e88f5af9f1ac2d84 (diff)
downloadcpython-5b027f87b5d62943d858082c5af84ab0636c0881.zip
cpython-5b027f87b5d62943d858082c5af84ab0636c0881.tar.gz
cpython-5b027f87b5d62943d858082c5af84ab0636c0881.tar.bz2
Update itertools recipes.
Diffstat (limited to 'Doc/library/itertools.rst')
-rw-r--r--Doc/library/itertools.rst35
1 files changed, 28 insertions, 7 deletions
diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst
index a98b2b6..a978c1a 100644
--- a/Doc/library/itertools.rst
+++ b/Doc/library/itertools.rst
@@ -666,9 +666,6 @@ which incur interpreter overhead.
"Return first n items of the iterable as a list"
return list(islice(iterable, n))
- def enumerate(iterable, start=0):
- return izip(count(start), iterable)
-
def tabulate(function, start=0):
"Return function(0), function(1), ..."
return imap(function, count(start))
@@ -747,10 +744,9 @@ which incur interpreter overhead.
seen = set()
seen_add = seen.add
if key is None:
- for element in iterable:
- if element not in seen:
- seen_add(element)
- yield element
+ for element in ifilterfalse(seen.__contains__, iterable):
+ seen_add(element)
+ yield element
else:
for element in iterable:
k = key(element)
@@ -763,3 +759,28 @@ which incur interpreter overhead.
# unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
# unique_justseen('ABBCcAD', str.lower) --> A B C A D
return imap(next, imap(itemgetter(1), groupby(iterable, key)))
+
+ def iter_except(func, exception, first=None):
+ """ Call a function repeatedly until an exception is raised.
+
+ Converts a call-until-exception interface to an iterator interface.
+ Like __builtin__.iter(func, sentinel) but uses an exception instead
+ of a sentinel to end the loop.
+
+ Examples:
+ bsddbiter = iter_except(db.next, bsddb.error, db.first)
+ heapiter = iter_except(functools.partial(heappop, h), IndexError)
+ dictiter = iter_except(d.popitem, KeyError)
+ dequeiter = iter_except(d.popleft, IndexError)
+ queueiter = iter_except(q.get_nowait, Queue.Empty)
+ setiter = iter_except(s.pop, KeyError)
+
+ """
+ try:
+ if first is not None:
+ yield first()
+ while 1:
+ yield func()
+ except exception:
+ pass
+