Kaydet (Commit) 6f45d18c authored tarafından Raymond Hettinger's avatar Raymond Hettinger

Improve itertools docs with clearer examples of pure python equivalent code.

üst e584457e
......@@ -1367,10 +1367,10 @@ are always available. They are listed here in alphabetical order.
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
sentinel = object()
iterables = [iter(it) for it in iterables]
while iterables:
iterators = [iter(it) for it in iterables]
while iterators:
result = []
for it in iterables:
for it in iterators:
elem = next(it, sentinel)
if elem is sentinel:
return
......
......@@ -557,16 +557,25 @@ loops that truncate the stream.
iterables are of uneven length, missing values are filled-in with *fillvalue*.
Iteration continues until the longest iterable is exhausted. Equivalent to::
def zip_longest(*args, fillvalue=None):
class ZipExhausted(Exception):
pass
def zip_longest(*args, **kwds):
# zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
def sentinel(counter = ([fillvalue]*(len(args)-1)).pop):
yield counter() # yields the fillvalue, or raises IndexError
fillvalue = kwds.get('fillvalue')
counter = len(args) - 1
def sentinel():
nonlocal counter
if not counter:
raise ZipExhausted
counter -= 1
yield fillvalue
fillers = repeat(fillvalue)
iters = [chain(it, sentinel(), fillers) for it in args]
iterators = [chain(it, sentinel(), fillers) for it in args]
try:
for tup in zip(*iters):
yield tup
except IndexError:
while iterators:
yield tuple(map(next, iterators))
except ZipExhausted:
pass
If one of the iterables is potentially infinite, then the :func:`zip_longest`
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment