diff --git a/Doc/lib/libitertools.tex b/Doc/lib/libitertools.tex index 780ed550237..9d7f7ca9c4f 100644 --- a/Doc/lib/libitertools.tex +++ b/Doc/lib/libitertools.tex @@ -250,16 +250,14 @@ by functions or loops that truncate the stream. third line). Equivalent to: \begin{verbatim} - def islice(iterable, *args): + def islice(iterable, *args): s = slice(*args) - next, stop, step = s.start or 0, s.stop, s.step or 1 - for cnt, element in enumerate(iterable): - if cnt < next: - continue - if stop is not None and cnt >= stop: - break - yield element - next += step + it = iter(xrange(s.start or 0, s.stop or sys.maxint, s.step or 1)) + nexti = it.next() + for i, element in enumerate(iterable): + if i == nexti: + yield element + nexti = it.next() \end{verbatim} If \var{start} is \code{None}, then iteration starts at zero. diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index 577082bd398..5db128cda14 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -265,6 +265,11 @@ class TestBasicOps(unittest.TestCase): self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10)) self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2)) + # Test number of items consumed SF #1171417 + it = iter(range(10)) + self.assertEqual(list(islice(it, 3)), range(3)) + self.assertEqual(list(it), range(3, 10)) + # Test invalid arguments self.assertRaises(TypeError, islice, xrange(10)) self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)