blob: ac3049556891f2a5c881a0243df9ead0dfcace2e [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
2from test import test_support
3from itertools import *
Raymond Hettingera9f60922004-10-17 16:40:14 +00004from weakref import proxy
Raymond Hettinger2012f172003-02-07 05:32:58 +00005import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00006import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00007import random
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00008
Guido van Rossum801f0d72006-08-24 19:48:10 +00009def lzip(*args):
10 return list(zip(*args))
11
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000012def onearg(x):
13 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000014 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000015
16def errfunc(*args):
17 'Test function that raises an error'
18 raise ValueError
19
20def gen3():
21 'Non-restartable source sequence'
22 for i in (0, 1, 2):
23 yield i
24
25def isEven(x):
26 'Test predicate'
27 return x%2==0
28
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000029def isOdd(x):
30 'Test predicate'
31 return x%2==1
32
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000033class StopNow:
34 'Class emulating an empty iterable.'
35 def __iter__(self):
36 return self
37 def next(self):
38 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000039
Raymond Hettinger02420702003-06-29 20:36:23 +000040def take(n, seq):
41 'Convenience function for partially consuming a long of infinite iterable'
42 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000043
Raymond Hettinger96ef8112003-02-01 00:10:11 +000044class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000045 def test_chain(self):
46 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000047 self.assertEqual(list(chain('abc')), list('abc'))
48 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000049 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000050 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000051
Raymond Hettinger96ef8112003-02-01 00:10:11 +000052 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +000053 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
54 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
55 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000056 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000057 self.assertRaises(TypeError, count, 'a')
58 c = count(sys.maxint-2) # verify that rollover doesn't crash
59 c.next(); c.next(); c.next(); c.next(); c.next()
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000060 c = count(3)
61 self.assertEqual(repr(c), 'count(3)')
62 c.next()
63 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +000064 c = count(-9)
65 self.assertEqual(repr(c), 'count(-9)')
66 c.next()
67 self.assertEqual(c.next(), -8)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000068
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000069 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000070 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000071 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000072 self.assertRaises(TypeError, cycle)
73 self.assertRaises(TypeError, cycle, 5)
74 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000075
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000076 def test_groupby(self):
77 # Check whether it accepts arguments correctly
78 self.assertEqual([], list(groupby([])))
79 self.assertEqual([], list(groupby([], key=id)))
80 self.assertRaises(TypeError, list, groupby('abc', []))
81 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000082 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000083
84 # Check normal input
85 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
86 (2,15,22), (3,16,23), (3,17,23)]
87 dup = []
88 for k, g in groupby(s, lambda r:r[0]):
89 for elem in g:
90 self.assertEqual(k, elem[0])
91 dup.append(elem)
92 self.assertEqual(s, dup)
93
94 # Check nested case
95 dup = []
96 for k, g in groupby(s, lambda r:r[0]):
97 for ik, ig in groupby(g, lambda r:r[2]):
98 for elem in ig:
99 self.assertEqual(k, elem[0])
100 self.assertEqual(ik, elem[2])
101 dup.append(elem)
102 self.assertEqual(s, dup)
103
104 # Check case where inner iterator is not used
105 keys = [k for k, g in groupby(s, lambda r:r[0])]
106 expectedkeys = set([r[0] for r in s])
107 self.assertEqual(set(keys), expectedkeys)
108 self.assertEqual(len(keys), len(expectedkeys))
109
110 # Exercise pipes and filters style
111 s = 'abracadabra'
112 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000113 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000114 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
115 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000116 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000117 self.assertEqual(r, ['a', 'b', 'r'])
118 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000119 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000120 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
121 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000122 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000123 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
124
125 # iter.next failure
126 class ExpectedError(Exception):
127 pass
128 def delayed_raise(n=0):
129 for i in range(n):
130 yield 'yo'
131 raise ExpectedError
132 def gulp(iterable, keyp=None, func=list):
133 return [func(g) for k, g in groupby(iterable, keyp)]
134
135 # iter.next failure on outer object
136 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
137 # iter.next failure on inner object
138 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
139
140 # __cmp__ failure
141 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000142 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000143 raise ExpectedError
144 s = [DummyCmp(), DummyCmp(), None]
145
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000146 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000147 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000148 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000149 self.assertRaises(ExpectedError, gulp, s)
150
151 # keyfunc failure
152 def keyfunc(obj):
153 if keyfunc.skip > 0:
154 keyfunc.skip -= 1
155 return obj
156 else:
157 raise ExpectedError
158
159 # keyfunc failure on outer object
160 keyfunc.skip = 0
161 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
162 keyfunc.skip = 1
163 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
164
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000165 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000166 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000167 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000168 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000169 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000170 self.assertRaises(TypeError, ifilter, lambda x:x)
171 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000172 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000173 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000174
175 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000176 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
177 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000178 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000179 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000180 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
181 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000182 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000183 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000184
185 def test_izip(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000186 # XXX This is rather silly now that builtin zip() calls izip()...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000187 ans = [(x,y) for x, y in izip('abc',count())]
188 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Guido van Rossum801f0d72006-08-24 19:48:10 +0000189 self.assertEqual(list(izip('abc', range(6))), lzip('abc', range(6)))
190 self.assertEqual(list(izip('abcdef', range(3))), lzip('abcdef', range(3)))
191 self.assertEqual(take(3,izip('abcdef', count())), lzip('abcdef', range(3)))
192 self.assertEqual(list(izip('abcdef')), lzip('abcdef'))
193 self.assertEqual(list(izip()), lzip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000194 self.assertRaises(TypeError, izip, 3)
195 self.assertRaises(TypeError, izip, range(3), 3)
196 # Check tuple re-use (implementation detail)
197 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000198 lzip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000199 self.assertEqual([pair for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000200 lzip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000201 ids = map(id, izip('abc', 'def'))
202 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000203 ids = map(id, list(izip('abc', 'def')))
204 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000205
206 def test_repeat(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000207 self.assertEqual(lzip(xrange(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000208 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000209 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000210 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000211 self.assertEqual(list(repeat('a', 0)), [])
212 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000213 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000214 self.assertRaises(TypeError, repeat, None, 3, 4)
215 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000216 r = repeat(1+0j)
217 self.assertEqual(repr(r), 'repeat((1+0j))')
218 r = repeat(1+0j, 5)
219 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
220 list(r)
221 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000222
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000223 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000224 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
225 [0**1, 1**2, 2**3])
226 self.assertEqual(list(imap(None, 'abc', range(5))),
227 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000228 self.assertEqual(list(imap(None, 'abc', count())),
229 [('a',0),('b',1),('c',2)])
230 self.assertEqual(take(2,imap(None, 'abc', count())),
231 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000232 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000233 self.assertRaises(TypeError, imap)
234 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000235 self.assertRaises(TypeError, imap(10, range(5)).next)
236 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
237 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000238
239 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000240 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
241 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000242 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
243 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000244 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000245 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000246 self.assertRaises(TypeError, starmap)
247 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
248 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
249 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
250 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000251
252 def test_islice(self):
253 for args in [ # islice(args) should agree with range(args)
254 (10, 20, 3),
255 (10, 3, 20),
256 (10, 20),
257 (10, 3),
258 (20,)
259 ]:
260 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
261
262 for args, tgtargs in [ # Stop when seqn is exhausted
263 ((10, 110, 3), ((10, 100, 3))),
264 ((10, 110), ((10, 100))),
265 ((110,), (100,))
266 ]:
267 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
268
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000269 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000270 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000271 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
272 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000273 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
274 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
275
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000276 # Test number of items consumed SF #1171417
277 it = iter(range(10))
278 self.assertEqual(list(islice(it, 3)), range(3))
279 self.assertEqual(list(it), range(3, 10))
280
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000281 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000282 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000283 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
284 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
285 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
286 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
287 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000288 self.assertRaises(ValueError, islice, xrange(10), 'a')
289 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
290 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
291 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
292 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Raymond Hettinger2012f172003-02-07 05:32:58 +0000293 self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000294
295 def test_takewhile(self):
296 data = [1, 3, 5, 20, 2, 4, 6, 8]
297 underten = lambda x: x<10
298 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000299 self.assertEqual(list(takewhile(underten, [])), [])
300 self.assertRaises(TypeError, takewhile)
301 self.assertRaises(TypeError, takewhile, operator.pow)
302 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
303 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
304 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000305 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
306 self.assertEqual(list(t), [1, 1, 1])
307 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000308
309 def test_dropwhile(self):
310 data = [1, 3, 5, 20, 2, 4, 6, 8]
311 underten = lambda x: x<10
312 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000313 self.assertEqual(list(dropwhile(underten, [])), [])
314 self.assertRaises(TypeError, dropwhile)
315 self.assertRaises(TypeError, dropwhile, operator.pow)
316 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
317 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
318 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000319
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000320 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000321 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000322 def irange(n):
323 for i in xrange(n):
324 yield i
325
326 a, b = tee([]) # test empty iterator
327 self.assertEqual(list(a), [])
328 self.assertEqual(list(b), [])
329
330 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000331 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000332
333 a, b = tee(irange(n)) # test 0% interleaved
334 self.assertEqual(list(a), range(n))
335 self.assertEqual(list(b), range(n))
336
337 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000338 for i in xrange(100):
339 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000340 del a
341 self.assertEqual(list(b), range(n))
342
343 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000344 for i in xrange(100):
345 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000346 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000347 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000348
349 for j in xrange(5): # test randomly interleaved
350 order = [0]*n + [1]*n
351 random.shuffle(order)
352 lists = ([], [])
353 its = tee(irange(n))
354 for i in order:
355 value = its[i].next()
356 lists[i].append(value)
357 self.assertEqual(lists[0], range(n))
358 self.assertEqual(lists[1], range(n))
359
Raymond Hettingerad983e72003-11-12 14:32:26 +0000360 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000361 self.assertRaises(TypeError, tee)
362 self.assertRaises(TypeError, tee, 3)
363 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000364 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000365
Raymond Hettingerad983e72003-11-12 14:32:26 +0000366 # tee object should be instantiable
367 a, b = tee('abc')
368 c = type(a)('def')
369 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000370
Raymond Hettingerad983e72003-11-12 14:32:26 +0000371 # test long-lagged and multi-way split
372 a, b, c = tee(xrange(2000), 3)
373 for i in xrange(100):
374 self.assertEqual(a.next(), i)
375 self.assertEqual(list(b), range(2000))
376 self.assertEqual([c.next(), c.next()], range(2))
377 self.assertEqual(list(a), range(100,2000))
378 self.assertEqual(list(c), range(2,2000))
379
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000380 # test values of n
381 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000382 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000383 for n in xrange(5):
384 result = tee('abc', n)
385 self.assertEqual(type(result), tuple)
386 self.assertEqual(len(result), n)
387 self.assertEqual(map(list, result), [list('abc')]*n)
388
Raymond Hettingerad983e72003-11-12 14:32:26 +0000389 # tee pass-through to copyable iterator
390 a, b = tee('abc')
391 c, d = tee(a)
392 self.assert_(a is c)
393
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000394 # test tee_new
395 t1, t2 = tee('abc')
396 tnew = type(t1)
397 self.assertRaises(TypeError, tnew)
398 self.assertRaises(TypeError, tnew, 10)
399 t3 = tnew(t1)
400 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000401
Raymond Hettingera9f60922004-10-17 16:40:14 +0000402 # test that tee objects are weak referencable
403 a, b = tee(xrange(10))
404 p = proxy(a)
405 self.assertEqual(getattr(p, '__class__'), type(b))
406 del a
407 self.assertRaises(ReferenceError, getattr, p, '__class__')
408
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000409 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000410 self.assertRaises(StopIteration, izip().next)
411
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000412 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000413 self.assertRaises(StopIteration, f([]).next)
414 self.assertRaises(StopIteration, f(StopNow()).next)
415
416 self.assertRaises(StopIteration, islice([], None).next)
417 self.assertRaises(StopIteration, islice(StopNow(), None).next)
418
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000419 p, q = tee([])
420 self.assertRaises(StopIteration, p.next)
421 self.assertRaises(StopIteration, q.next)
422 p, q = tee(StopNow())
423 self.assertRaises(StopIteration, p.next)
424 self.assertRaises(StopIteration, q.next)
425
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000426 self.assertRaises(StopIteration, repeat(None, 0).next)
427
428 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
429 self.assertRaises(StopIteration, f(lambda x:x, []).next)
430 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
431
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000432class TestGC(unittest.TestCase):
433
434 def makecycle(self, iterator, container):
435 container.append(iterator)
436 iterator.next()
437 del container, iterator
438
439 def test_chain(self):
440 a = []
441 self.makecycle(chain(a), a)
442
443 def test_cycle(self):
444 a = []
445 self.makecycle(cycle([a]*2), a)
446
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000447 def test_dropwhile(self):
448 a = []
449 self.makecycle(dropwhile(bool, [0, a, a]), a)
450
451 def test_groupby(self):
452 a = []
453 self.makecycle(groupby([a]*2, lambda x:x), a)
454
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000455 def test_ifilter(self):
456 a = []
457 self.makecycle(ifilter(lambda x:True, [a]*2), a)
458
459 def test_ifilterfalse(self):
460 a = []
461 self.makecycle(ifilterfalse(lambda x:False, a), a)
462
463 def test_izip(self):
464 a = []
465 self.makecycle(izip([a]*2, [a]*3), a)
466
467 def test_imap(self):
468 a = []
469 self.makecycle(imap(lambda x:x, [a]*2), a)
470
471 def test_islice(self):
472 a = []
473 self.makecycle(islice([a]*2, None), a)
474
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000475 def test_repeat(self):
476 a = []
477 self.makecycle(repeat(a), a)
478
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000479 def test_starmap(self):
480 a = []
481 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
482
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000483 def test_takewhile(self):
484 a = []
485 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
486
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000487def R(seqn):
488 'Regular generator'
489 for i in seqn:
490 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000491
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000492class G:
493 'Sequence using __getitem__'
494 def __init__(self, seqn):
495 self.seqn = seqn
496 def __getitem__(self, i):
497 return self.seqn[i]
498
499class I:
500 'Sequence using iterator protocol'
501 def __init__(self, seqn):
502 self.seqn = seqn
503 self.i = 0
504 def __iter__(self):
505 return self
506 def next(self):
507 if self.i >= len(self.seqn): raise StopIteration
508 v = self.seqn[self.i]
509 self.i += 1
510 return v
511
512class Ig:
513 'Sequence using iterator protocol defined with a generator'
514 def __init__(self, seqn):
515 self.seqn = seqn
516 self.i = 0
517 def __iter__(self):
518 for val in self.seqn:
519 yield val
520
521class X:
522 'Missing __getitem__ and __iter__'
523 def __init__(self, seqn):
524 self.seqn = seqn
525 self.i = 0
526 def next(self):
527 if self.i >= len(self.seqn): raise StopIteration
528 v = self.seqn[self.i]
529 self.i += 1
530 return v
531
532class N:
533 'Iterator missing next()'
534 def __init__(self, seqn):
535 self.seqn = seqn
536 self.i = 0
537 def __iter__(self):
538 return self
539
540class E:
541 'Test propagation of exceptions'
542 def __init__(self, seqn):
543 self.seqn = seqn
544 self.i = 0
545 def __iter__(self):
546 return self
547 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000548 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000549
550class S:
551 'Test immediate stop'
552 def __init__(self, seqn):
553 pass
554 def __iter__(self):
555 return self
556 def next(self):
557 raise StopIteration
558
559def L(seqn):
560 'Test multiple tiers of iterators'
561 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
562
563
564class TestVariousIteratorArgs(unittest.TestCase):
565
566 def test_chain(self):
567 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
568 for g in (G, I, Ig, S, L, R):
569 self.assertEqual(list(chain(g(s))), list(g(s)))
570 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
571 self.assertRaises(TypeError, chain, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000572 self.assertRaises(TypeError, chain, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000573 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
574
575 def test_cycle(self):
576 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
577 for g in (G, I, Ig, S, L, R):
578 tgtlen = len(s) * 3
579 expected = list(g(s))*3
580 actual = list(islice(cycle(g(s)), tgtlen))
581 self.assertEqual(actual, expected)
582 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000583 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000584 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
585
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000586 def test_groupby(self):
587 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
588 for g in (G, I, Ig, S, L, R):
589 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
590 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000591 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000592 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
593
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000594 def test_ifilter(self):
595 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
596 for g in (G, I, Ig, S, L, R):
597 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
598 self.assertRaises(TypeError, ifilter, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000599 self.assertRaises(TypeError, ifilter, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000600 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
601
602 def test_ifilterfalse(self):
603 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
604 for g in (G, I, Ig, S, L, R):
605 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
606 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000607 self.assertRaises(TypeError, ifilterfalse, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000608 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
609
610 def test_izip(self):
611 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
612 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000613 self.assertEqual(list(izip(g(s))), lzip(g(s)))
614 self.assertEqual(list(izip(g(s), g(s))), lzip(g(s), g(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000615 self.assertRaises(TypeError, izip, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000616 self.assertRaises(TypeError, izip, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000617 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
618
619 def test_imap(self):
620 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
621 for g in (G, I, Ig, S, L, R):
622 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
623 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
624 self.assertRaises(TypeError, imap, onearg, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000625 self.assertRaises(TypeError, imap, onearg, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000626 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
627
628 def test_islice(self):
629 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
630 for g in (G, I, Ig, S, L, R):
631 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
632 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000633 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000634 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
635
636 def test_starmap(self):
637 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
638 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000639 ss = lzip(s, s)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000640 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
641 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000642 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000643 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
644
645 def test_takewhile(self):
646 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
647 for g in (G, I, Ig, S, L, R):
648 tgt = []
649 for elem in g(s):
650 if not isEven(elem): break
651 tgt.append(elem)
652 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
653 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000654 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000655 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
656
657 def test_dropwhile(self):
658 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
659 for g in (G, I, Ig, S, L, R):
660 tgt = []
661 for elem in g(s):
662 if not tgt and isOdd(elem): continue
663 tgt.append(elem)
664 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
665 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000666 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000667 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
668
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000669 def test_tee(self):
670 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
671 for g in (G, I, Ig, S, L, R):
672 it1, it2 = tee(g(s))
673 self.assertEqual(list(it1), list(g(s)))
674 self.assertEqual(list(it2), list(g(s)))
675 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000676 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000677 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
678
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000679class LengthTransparency(unittest.TestCase):
680
681 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000682 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000683 self.assertEqual(len(repeat(None, 50)), 50)
684 self.assertRaises(TypeError, len, repeat(None))
685
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000686class RegressionTests(unittest.TestCase):
687
688 def test_sf_793826(self):
689 # Fix Armin Rigo's successful efforts to wreak havoc
690
691 def mutatingtuple(tuple1, f, tuple2):
692 # this builds a tuple t which is a copy of tuple1,
693 # then calls f(t), then mutates t to be equal to tuple2
694 # (needs len(tuple1) == len(tuple2)).
695 def g(value, first=[1]):
696 if first:
697 del first[:]
698 f(z.next())
699 return value
700 items = list(tuple2)
701 items[1:1] = list(tuple1)
702 gen = imap(g, items)
703 z = izip(*[gen]*len(tuple1))
704 z.next()
705
706 def f(t):
707 global T
708 T = t
709 first[:] = list(T)
710
711 first = []
712 mutatingtuple((1,2,3), f, (4,5,6))
713 second = list(T)
714 self.assertEqual(first, second)
715
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000716
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000717 def test_sf_950057(self):
718 # Make sure that chain() and cycle() catch exceptions immediately
719 # rather than when shifting between input sources
720
721 def gen1():
722 hist.append(0)
723 yield 1
724 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000725 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000726 hist.append(2)
727
728 def gen2(x):
729 hist.append(3)
730 yield 2
731 hist.append(4)
732 if x:
733 raise StopIteration
734
735 hist = []
736 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
737 self.assertEqual(hist, [0,1])
738
739 hist = []
740 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
741 self.assertEqual(hist, [0,1])
742
743 hist = []
744 self.assertRaises(AssertionError, list, cycle(gen1()))
745 self.assertEqual(hist, [0,1])
746
Thomas Woutersb2137042007-02-01 18:02:27 +0000747class SubclassWithKwargsTest(unittest.TestCase):
748 def test_keywords_in_subclass(self):
749 # count is not subclassable...
750 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
751 starmap, islice, takewhile, dropwhile, cycle):
752 class Subclass(cls):
753 def __init__(self, newarg=None, *args):
754 cls.__init__(self, *args)
755 try:
756 Subclass(newarg=1)
757 except TypeError as err:
758 # we expect type errors because of wrong argument count
759 self.failIf("does not take keyword arguments" in err.args[0])
760
761
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000762libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000763
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000764
765>>> amounts = [120.15, 764.05, 823.14]
766>>> for checknum, amount in izip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +0000767... print('Check %d is for $%.2f' % (checknum, amount))
768...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000769Check 1200 is for $120.15
770Check 1201 is for $764.05
771Check 1202 is for $823.14
772
773>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000774>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +0000775... print(cube)
776...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00007771
7788
77927
780
781>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000782>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +0000783... print(name.title())
784...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000785Alex
786Laura
787Martin
788Walter
789Samuele
790
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000791>>> from operator import itemgetter
792>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000793>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000794>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossum7131f842007-02-09 20:13:25 +0000795... print(k, map(itemgetter(0), g))
796...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00007971 ['a', 'c', 'e']
7982 ['b', 'd', 'f']
7993 ['g']
800
Raymond Hettinger734fb572004-01-20 20:04:40 +0000801# Find runs of consecutive numbers using groupby. The key to the solution
802# is differencing with a range so that consecutive numbers all appear in
803# same group.
804>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
805>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
Guido van Rossum7131f842007-02-09 20:13:25 +0000806... print(map(operator.itemgetter(1), g))
807...
Raymond Hettinger734fb572004-01-20 20:04:40 +0000808[1]
809[4, 5, 6]
810[10]
811[15, 16, 17, 18]
812[22]
813[25, 26, 27, 28]
814
Raymond Hettingera098b332003-09-08 23:58:40 +0000815>>> def take(n, seq):
816... return list(islice(seq, n))
817
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000818>>> def enumerate(iterable):
819... return izip(count(), iterable)
820
821>>> def tabulate(function):
822... "Return function(0), function(1), ..."
823... return imap(function, count())
824
825>>> def iteritems(mapping):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000826... return izip(mapping.keys(), mapping.values())
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000827
828>>> def nth(iterable, n):
829... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000830... return list(islice(iterable, n, n+1))
831
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000832>>> def all(seq, pred=None):
833... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000834... for elem in ifilterfalse(pred, seq):
835... return False
836... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000837
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000838>>> def any(seq, pred=None):
839... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000840... for elem in ifilter(pred, seq):
841... return True
842... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000843
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000844>>> def no(seq, pred=None):
845... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000846... for elem in ifilter(pred, seq):
847... return False
848... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000849
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000850>>> def quantify(seq, pred=None):
851... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000852... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000853
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000854>>> def padnone(seq):
855... "Returns the sequence elements and then returns None indefinitely"
856... return chain(seq, repeat(None))
857
858>>> def ncycles(seq, n):
859... "Returns the sequence elements n times"
860... return chain(*repeat(seq, n))
861
862>>> def dotproduct(vec1, vec2):
863... return sum(imap(operator.mul, vec1, vec2))
864
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000865>>> def flatten(listOfLists):
866... return list(chain(*listOfLists))
867
868>>> def repeatfunc(func, times=None, *args):
869... "Repeat calls to func with specified arguments."
870... " Example: repeatfunc(random.random)"
871... if times is None:
872... return starmap(func, repeat(args))
873... else:
874... return starmap(func, repeat(args, times))
875
Raymond Hettingerd591f662003-10-26 15:34:50 +0000876>>> def pairwise(iterable):
877... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
878... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000879... try:
880... b.next()
881... except StopIteration:
882... pass
883... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000884
885This is not part of the examples but it tests to make sure the definitions
886perform as purported.
887
Raymond Hettingera098b332003-09-08 23:58:40 +0000888>>> take(10, count())
889[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
890
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000891>>> list(enumerate('abc'))
892[(0, 'a'), (1, 'b'), (2, 'c')]
893
894>>> list(islice(tabulate(lambda x: 2*x), 4))
895[0, 2, 4, 6]
896
897>>> nth('abcde', 3)
898['d']
899
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000900>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000901True
902
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000903>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000904False
905
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000906>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000907True
908
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000909>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000910False
911
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000912>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000913True
914
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000915>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000916False
917
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000918>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000091950
920
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000921>>> a = [[1, 2, 3], [4, 5, 6]]
922>>> flatten(a)
923[1, 2, 3, 4, 5, 6]
924
925>>> list(repeatfunc(pow, 5, 2, 3))
926[8, 8, 8, 8, 8]
927
928>>> import random
929>>> take(5, imap(int, repeatfunc(random.random)))
930[0, 0, 0, 0, 0]
931
Raymond Hettingerd591f662003-10-26 15:34:50 +0000932>>> list(pairwise('abcd'))
933[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000934
Raymond Hettingerd591f662003-10-26 15:34:50 +0000935>>> list(pairwise([]))
936[]
937
938>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000939[]
940
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000941>>> list(islice(padnone('abc'), 0, 6))
942['a', 'b', 'c', None, None, None]
943
944>>> list(ncycles('abc', 3))
945['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
946
947>>> dotproduct([1,2,3], [4,5,6])
94832
949
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000950"""
951
952__test__ = {'libreftest' : libreftest}
953
954def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000955 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +0000956 RegressionTests, LengthTransparency,
957 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000958 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000959
960 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000961 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +0000962 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000963 counts = [None] * 5
964 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000965 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +0000966 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000967 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000968 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000969
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000970 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +0000971 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000972
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000973if __name__ == "__main__":
974 test_main(verbose=True)