Skip to content

Commit

Permalink
pythongh-118476: Fix corner cases in islice() rough equivalent. (pyth…
Browse files Browse the repository at this point in the history
  • Loading branch information
rhettinger authored and SonicField committed May 8, 2024
1 parent af0f038 commit 641db9e
Showing 1 changed file with 11 additions and 18 deletions.
29 changes: 11 additions & 18 deletions Doc/library/itertools.rst
Original file line number Diff line number Diff line change
Expand Up @@ -504,24 +504,17 @@ loops that truncate the stream.
# islice('ABCDEFG', 2, None) → C D E F G
# islice('ABCDEFG', 0, None, 2) → A C E G
s = slice(*args)
start, stop, step = s.start or 0, s.stop or sys.maxsize, s.step or 1
it = iter(range(start, stop, step))
try:
nexti = next(it)
except StopIteration:
# Consume *iterable* up to the *start* position.
for i, element in zip(range(start), iterable):
pass
return
try:
for i, element in enumerate(iterable):
if i == nexti:
yield element
nexti = next(it)
except StopIteration:
# Consume to *stop*.
for i, element in zip(range(i + 1, stop), iterable):
pass
start = 0 if s.start is None else s.start
stop = s.stop
step = 1 if s.step is None else s.step
if start < 0 or (stop is not None and stop < 0) or step <= 0:
raise ValueError
indices = count() if stop is None else range(max(stop, start))
next_i = start
for i, element in zip(indices, iterable):
if i == next_i:
yield element
next_i += step


.. function:: pairwise(iterable)
Expand Down

0 comments on commit 641db9e

Please sign in to comment.