summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/lib/libitertools.tex16
-rw-r--r--Lib/test/test_itertools.py5
2 files changed, 12 insertions, 9 deletions
diff --git a/Doc/lib/libitertools.tex b/Doc/lib/libitertools.tex
index 780ed55..9d7f7ca 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 577082b..5db128c 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)