blob: 3a370d965f5233359182ef754a4200df7bba276a [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
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +00008maxsize = test_support.MAX_Py_ssize_t
9minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000010
11def onearg(x):
12 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000013 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000014
15def errfunc(*args):
16 'Test function that raises an error'
17 raise ValueError
18
19def gen3():
20 'Non-restartable source sequence'
21 for i in (0, 1, 2):
22 yield i
23
24def isEven(x):
25 'Test predicate'
26 return x%2==0
27
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000028def isOdd(x):
29 'Test predicate'
30 return x%2==1
31
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000032class StopNow:
33 'Class emulating an empty iterable.'
34 def __iter__(self):
35 return self
36 def next(self):
37 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000038
Raymond Hettinger02420702003-06-29 20:36:23 +000039def take(n, seq):
40 'Convenience function for partially consuming a long of infinite iterable'
41 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000042
Raymond Hettinger96ef8112003-02-01 00:10:11 +000043class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000044 def test_chain(self):
45 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000046 self.assertEqual(list(chain('abc')), list('abc'))
47 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000048 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000049 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000050
Raymond Hettinger96ef8112003-02-01 00:10:11 +000051 def test_count(self):
52 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
53 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +000054 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger50e90e22007-10-04 00:20:27 +000055 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
56 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000057 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000058 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger50e90e22007-10-04 00:20:27 +000059 self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
60 self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000061 c = count(3)
62 self.assertEqual(repr(c), 'count(3)')
63 c.next()
64 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +000065 c = count(-9)
66 self.assertEqual(repr(c), 'count(-9)')
67 c.next()
68 self.assertEqual(c.next(), -8)
Raymond Hettinger50e90e22007-10-04 00:20:27 +000069 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
70 self.assertEqual(repr(count(i)), 'count(%r)' % i)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000071
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000072 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000073 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000074 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000075 self.assertRaises(TypeError, cycle)
76 self.assertRaises(TypeError, cycle, 5)
77 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000078
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000079 def test_groupby(self):
80 # Check whether it accepts arguments correctly
81 self.assertEqual([], list(groupby([])))
82 self.assertEqual([], list(groupby([], key=id)))
83 self.assertRaises(TypeError, list, groupby('abc', []))
84 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000085 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000086
87 # Check normal input
88 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
89 (2,15,22), (3,16,23), (3,17,23)]
90 dup = []
91 for k, g in groupby(s, lambda r:r[0]):
92 for elem in g:
93 self.assertEqual(k, elem[0])
94 dup.append(elem)
95 self.assertEqual(s, dup)
96
97 # Check nested case
98 dup = []
99 for k, g in groupby(s, lambda r:r[0]):
100 for ik, ig in groupby(g, lambda r:r[2]):
101 for elem in ig:
102 self.assertEqual(k, elem[0])
103 self.assertEqual(ik, elem[2])
104 dup.append(elem)
105 self.assertEqual(s, dup)
106
107 # Check case where inner iterator is not used
108 keys = [k for k, g in groupby(s, lambda r:r[0])]
109 expectedkeys = set([r[0] for r in s])
110 self.assertEqual(set(keys), expectedkeys)
111 self.assertEqual(len(keys), len(expectedkeys))
112
113 # Exercise pipes and filters style
114 s = 'abracadabra'
115 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000116 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000117 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
118 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000119 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000120 self.assertEqual(r, ['a', 'b', 'r'])
121 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000122 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000123 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
124 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000125 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000126 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
127
128 # iter.next failure
129 class ExpectedError(Exception):
130 pass
131 def delayed_raise(n=0):
132 for i in range(n):
133 yield 'yo'
134 raise ExpectedError
135 def gulp(iterable, keyp=None, func=list):
136 return [func(g) for k, g in groupby(iterable, keyp)]
137
138 # iter.next failure on outer object
139 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
140 # iter.next failure on inner object
141 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
142
143 # __cmp__ failure
144 class DummyCmp:
145 def __cmp__(self, dst):
146 raise ExpectedError
147 s = [DummyCmp(), DummyCmp(), None]
148
149 # __cmp__ failure on outer object
150 self.assertRaises(ExpectedError, gulp, s, func=id)
151 # __cmp__ failure on inner object
152 self.assertRaises(ExpectedError, gulp, s)
153
154 # keyfunc failure
155 def keyfunc(obj):
156 if keyfunc.skip > 0:
157 keyfunc.skip -= 1
158 return obj
159 else:
160 raise ExpectedError
161
162 # keyfunc failure on outer object
163 keyfunc.skip = 0
164 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
165 keyfunc.skip = 1
166 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
167
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000168 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000169 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000170 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000171 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000172 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000173 self.assertRaises(TypeError, ifilter, lambda x:x)
174 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000175 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000176 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000177
178 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000179 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
180 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000181 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000182 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000183 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
184 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000185 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000186 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000187
188 def test_izip(self):
189 ans = [(x,y) for x, y in izip('abc',count())]
190 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000191 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
192 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000193 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000194 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000195 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000196 self.assertRaises(TypeError, izip, 3)
197 self.assertRaises(TypeError, izip, range(3), 3)
198 # Check tuple re-use (implementation detail)
199 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
200 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000201 self.assertEqual([pair for pair in izip('abc', 'def')],
202 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000203 ids = map(id, izip('abc', 'def'))
204 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000205 ids = map(id, list(izip('abc', 'def')))
206 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000207
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000208 def test_iziplongest(self):
209 for args in [
210 ['abc', range(6)],
211 [range(6), 'abc'],
212 [range(1000), range(2000,2100), range(3000,3050)],
213 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
214 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
215 ]:
216 target = map(None, *args)
217 self.assertEqual(list(izip_longest(*args)), target)
218 self.assertEqual(list(izip_longest(*args, **{})), target)
219 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
220 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000221
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000222 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
223
224 self.assertEqual(list(izip_longest()), zip())
225 self.assertEqual(list(izip_longest([])), zip([]))
226 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000227
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000228 self.assertEqual(list(izip_longest('abc', 'defg', **{})), map(None, 'abc', 'defg')) # empty keyword dict
229 self.assertRaises(TypeError, izip_longest, 3)
230 self.assertRaises(TypeError, izip_longest, range(3), 3)
231
232 for stmt in [
233 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000234 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000235 ]:
236 try:
237 eval(stmt, globals(), locals())
238 except TypeError:
239 pass
240 else:
241 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000242
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000243 # Check tuple re-use (implementation detail)
244 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
245 zip('abc', 'def'))
246 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
247 zip('abc', 'def'))
248 ids = map(id, izip_longest('abc', 'def'))
249 self.assertEqual(min(ids), max(ids))
250 ids = map(id, list(izip_longest('abc', 'def')))
251 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
252
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000253 def test_repeat(self):
254 self.assertEqual(zip(xrange(3),repeat('a')),
255 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000256 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000257 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000258 self.assertEqual(list(repeat('a', 0)), [])
259 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000260 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000261 self.assertRaises(TypeError, repeat, None, 3, 4)
262 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000263 r = repeat(1+0j)
264 self.assertEqual(repr(r), 'repeat((1+0j))')
265 r = repeat(1+0j, 5)
266 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
267 list(r)
268 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000269
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000270 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000271 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
272 [0**1, 1**2, 2**3])
273 self.assertEqual(list(imap(None, 'abc', range(5))),
274 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000275 self.assertEqual(list(imap(None, 'abc', count())),
276 [('a',0),('b',1),('c',2)])
277 self.assertEqual(take(2,imap(None, 'abc', count())),
278 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000279 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000280 self.assertRaises(TypeError, imap)
281 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000282 self.assertRaises(TypeError, imap(10, range(5)).next)
283 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
284 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000285
286 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000287 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
288 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000289 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
290 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000291 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000292 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000293 self.assertRaises(TypeError, starmap)
294 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
295 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
296 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
297 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000298
299 def test_islice(self):
300 for args in [ # islice(args) should agree with range(args)
301 (10, 20, 3),
302 (10, 3, 20),
303 (10, 20),
304 (10, 3),
305 (20,)
306 ]:
307 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
308
309 for args, tgtargs in [ # Stop when seqn is exhausted
310 ((10, 110, 3), ((10, 100, 3))),
311 ((10, 110), ((10, 100))),
312 ((110,), (100,))
313 ]:
314 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
315
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000316 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000317 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000318 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
319 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000320 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
321 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
322
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000323 # Test number of items consumed SF #1171417
324 it = iter(range(10))
325 self.assertEqual(list(islice(it, 3)), range(3))
326 self.assertEqual(list(it), range(3, 10))
327
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000328 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000329 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000330 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
331 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
332 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
333 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
334 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000335 self.assertRaises(ValueError, islice, xrange(10), 'a')
336 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
337 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
338 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
339 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000340 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000341
342 def test_takewhile(self):
343 data = [1, 3, 5, 20, 2, 4, 6, 8]
344 underten = lambda x: x<10
345 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000346 self.assertEqual(list(takewhile(underten, [])), [])
347 self.assertRaises(TypeError, takewhile)
348 self.assertRaises(TypeError, takewhile, operator.pow)
349 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
350 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
351 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000352 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
353 self.assertEqual(list(t), [1, 1, 1])
354 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000355
356 def test_dropwhile(self):
357 data = [1, 3, 5, 20, 2, 4, 6, 8]
358 underten = lambda x: x<10
359 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000360 self.assertEqual(list(dropwhile(underten, [])), [])
361 self.assertRaises(TypeError, dropwhile)
362 self.assertRaises(TypeError, dropwhile, operator.pow)
363 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
364 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
365 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000366
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000367 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000368 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000369 def irange(n):
370 for i in xrange(n):
371 yield i
372
373 a, b = tee([]) # test empty iterator
374 self.assertEqual(list(a), [])
375 self.assertEqual(list(b), [])
376
377 a, b = tee(irange(n)) # test 100% interleaved
378 self.assertEqual(zip(a,b), zip(range(n),range(n)))
379
380 a, b = tee(irange(n)) # test 0% interleaved
381 self.assertEqual(list(a), range(n))
382 self.assertEqual(list(b), range(n))
383
384 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000385 for i in xrange(100):
386 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000387 del a
388 self.assertEqual(list(b), range(n))
389
390 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000391 for i in xrange(100):
392 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000393 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000394 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000395
396 for j in xrange(5): # test randomly interleaved
397 order = [0]*n + [1]*n
398 random.shuffle(order)
399 lists = ([], [])
400 its = tee(irange(n))
401 for i in order:
402 value = its[i].next()
403 lists[i].append(value)
404 self.assertEqual(lists[0], range(n))
405 self.assertEqual(lists[1], range(n))
406
Raymond Hettingerad983e72003-11-12 14:32:26 +0000407 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000408 self.assertRaises(TypeError, tee)
409 self.assertRaises(TypeError, tee, 3)
410 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000411 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000412
Raymond Hettingerad983e72003-11-12 14:32:26 +0000413 # tee object should be instantiable
414 a, b = tee('abc')
415 c = type(a)('def')
416 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000417
Raymond Hettingerad983e72003-11-12 14:32:26 +0000418 # test long-lagged and multi-way split
419 a, b, c = tee(xrange(2000), 3)
420 for i in xrange(100):
421 self.assertEqual(a.next(), i)
422 self.assertEqual(list(b), range(2000))
423 self.assertEqual([c.next(), c.next()], range(2))
424 self.assertEqual(list(a), range(100,2000))
425 self.assertEqual(list(c), range(2,2000))
426
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000427 # test values of n
428 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000429 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000430 for n in xrange(5):
431 result = tee('abc', n)
432 self.assertEqual(type(result), tuple)
433 self.assertEqual(len(result), n)
434 self.assertEqual(map(list, result), [list('abc')]*n)
435
Raymond Hettingerad983e72003-11-12 14:32:26 +0000436 # tee pass-through to copyable iterator
437 a, b = tee('abc')
438 c, d = tee(a)
439 self.assert_(a is c)
440
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000441 # test tee_new
442 t1, t2 = tee('abc')
443 tnew = type(t1)
444 self.assertRaises(TypeError, tnew)
445 self.assertRaises(TypeError, tnew, 10)
446 t3 = tnew(t1)
447 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000448
Raymond Hettingera9f60922004-10-17 16:40:14 +0000449 # test that tee objects are weak referencable
450 a, b = tee(xrange(10))
451 p = proxy(a)
452 self.assertEqual(getattr(p, '__class__'), type(b))
453 del a
454 self.assertRaises(ReferenceError, getattr, p, '__class__')
455
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000456 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000457 self.assertRaises(StopIteration, izip().next)
458
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000459 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000460 self.assertRaises(StopIteration, f([]).next)
461 self.assertRaises(StopIteration, f(StopNow()).next)
462
463 self.assertRaises(StopIteration, islice([], None).next)
464 self.assertRaises(StopIteration, islice(StopNow(), None).next)
465
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000466 p, q = tee([])
467 self.assertRaises(StopIteration, p.next)
468 self.assertRaises(StopIteration, q.next)
469 p, q = tee(StopNow())
470 self.assertRaises(StopIteration, p.next)
471 self.assertRaises(StopIteration, q.next)
472
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000473 self.assertRaises(StopIteration, repeat(None, 0).next)
474
475 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
476 self.assertRaises(StopIteration, f(lambda x:x, []).next)
477 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
478
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000479class TestGC(unittest.TestCase):
480
481 def makecycle(self, iterator, container):
482 container.append(iterator)
483 iterator.next()
484 del container, iterator
485
486 def test_chain(self):
487 a = []
488 self.makecycle(chain(a), a)
489
490 def test_cycle(self):
491 a = []
492 self.makecycle(cycle([a]*2), a)
493
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000494 def test_dropwhile(self):
495 a = []
496 self.makecycle(dropwhile(bool, [0, a, a]), a)
497
498 def test_groupby(self):
499 a = []
500 self.makecycle(groupby([a]*2, lambda x:x), a)
501
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000502 def test_ifilter(self):
503 a = []
504 self.makecycle(ifilter(lambda x:True, [a]*2), a)
505
506 def test_ifilterfalse(self):
507 a = []
508 self.makecycle(ifilterfalse(lambda x:False, a), a)
509
510 def test_izip(self):
511 a = []
512 self.makecycle(izip([a]*2, [a]*3), a)
513
514 def test_imap(self):
515 a = []
516 self.makecycle(imap(lambda x:x, [a]*2), a)
517
518 def test_islice(self):
519 a = []
520 self.makecycle(islice([a]*2, None), a)
521
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000522 def test_repeat(self):
523 a = []
524 self.makecycle(repeat(a), a)
525
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000526 def test_starmap(self):
527 a = []
528 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
529
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000530 def test_takewhile(self):
531 a = []
532 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
533
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000534def R(seqn):
535 'Regular generator'
536 for i in seqn:
537 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000538
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000539class G:
540 'Sequence using __getitem__'
541 def __init__(self, seqn):
542 self.seqn = seqn
543 def __getitem__(self, i):
544 return self.seqn[i]
545
546class I:
547 'Sequence using iterator protocol'
548 def __init__(self, seqn):
549 self.seqn = seqn
550 self.i = 0
551 def __iter__(self):
552 return self
553 def next(self):
554 if self.i >= len(self.seqn): raise StopIteration
555 v = self.seqn[self.i]
556 self.i += 1
557 return v
558
559class Ig:
560 'Sequence using iterator protocol defined with a generator'
561 def __init__(self, seqn):
562 self.seqn = seqn
563 self.i = 0
564 def __iter__(self):
565 for val in self.seqn:
566 yield val
567
568class X:
569 'Missing __getitem__ and __iter__'
570 def __init__(self, seqn):
571 self.seqn = seqn
572 self.i = 0
573 def next(self):
574 if self.i >= len(self.seqn): raise StopIteration
575 v = self.seqn[self.i]
576 self.i += 1
577 return v
578
579class N:
580 'Iterator missing next()'
581 def __init__(self, seqn):
582 self.seqn = seqn
583 self.i = 0
584 def __iter__(self):
585 return self
586
587class E:
588 'Test propagation of exceptions'
589 def __init__(self, seqn):
590 self.seqn = seqn
591 self.i = 0
592 def __iter__(self):
593 return self
594 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000595 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000596
597class S:
598 'Test immediate stop'
599 def __init__(self, seqn):
600 pass
601 def __iter__(self):
602 return self
603 def next(self):
604 raise StopIteration
605
606def L(seqn):
607 'Test multiple tiers of iterators'
608 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
609
610
611class TestVariousIteratorArgs(unittest.TestCase):
612
613 def test_chain(self):
614 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
615 for g in (G, I, Ig, S, L, R):
616 self.assertEqual(list(chain(g(s))), list(g(s)))
617 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
618 self.assertRaises(TypeError, chain, X(s))
619 self.assertRaises(TypeError, list, chain(N(s)))
620 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
621
622 def test_cycle(self):
623 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
624 for g in (G, I, Ig, S, L, R):
625 tgtlen = len(s) * 3
626 expected = list(g(s))*3
627 actual = list(islice(cycle(g(s)), tgtlen))
628 self.assertEqual(actual, expected)
629 self.assertRaises(TypeError, cycle, X(s))
630 self.assertRaises(TypeError, list, cycle(N(s)))
631 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
632
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000633 def test_groupby(self):
634 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
635 for g in (G, I, Ig, S, L, R):
636 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
637 self.assertRaises(TypeError, groupby, X(s))
638 self.assertRaises(TypeError, list, groupby(N(s)))
639 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
640
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000641 def test_ifilter(self):
642 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
643 for g in (G, I, Ig, S, L, R):
644 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
645 self.assertRaises(TypeError, ifilter, isEven, X(s))
646 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
647 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
648
649 def test_ifilterfalse(self):
650 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
651 for g in (G, I, Ig, S, L, R):
652 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
653 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
654 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
655 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
656
657 def test_izip(self):
658 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
659 for g in (G, I, Ig, S, L, R):
660 self.assertEqual(list(izip(g(s))), zip(g(s)))
661 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
662 self.assertRaises(TypeError, izip, X(s))
663 self.assertRaises(TypeError, list, izip(N(s)))
664 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
665
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000666 def test_iziplongest(self):
667 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
668 for g in (G, I, Ig, S, L, R):
669 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
670 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
671 self.assertRaises(TypeError, izip_longest, X(s))
672 self.assertRaises(TypeError, list, izip_longest(N(s)))
673 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
674
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000675 def test_imap(self):
676 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
677 for g in (G, I, Ig, S, L, R):
678 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
679 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
680 self.assertRaises(TypeError, imap, onearg, X(s))
681 self.assertRaises(TypeError, list, imap(onearg, N(s)))
682 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
683
684 def test_islice(self):
685 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
686 for g in (G, I, Ig, S, L, R):
687 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
688 self.assertRaises(TypeError, islice, X(s), 10)
689 self.assertRaises(TypeError, list, islice(N(s), 10))
690 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
691
692 def test_starmap(self):
693 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
694 for g in (G, I, Ig, S, L, R):
695 ss = zip(s, s)
696 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
697 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
698 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
699 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
700
701 def test_takewhile(self):
702 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
703 for g in (G, I, Ig, S, L, R):
704 tgt = []
705 for elem in g(s):
706 if not isEven(elem): break
707 tgt.append(elem)
708 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
709 self.assertRaises(TypeError, takewhile, isEven, X(s))
710 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
711 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
712
713 def test_dropwhile(self):
714 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
715 for g in (G, I, Ig, S, L, R):
716 tgt = []
717 for elem in g(s):
718 if not tgt and isOdd(elem): continue
719 tgt.append(elem)
720 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
721 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
722 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
723 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
724
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000725 def test_tee(self):
726 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
727 for g in (G, I, Ig, S, L, R):
728 it1, it2 = tee(g(s))
729 self.assertEqual(list(it1), list(g(s)))
730 self.assertEqual(list(it2), list(g(s)))
731 self.assertRaises(TypeError, tee, X(s))
732 self.assertRaises(TypeError, list, tee(N(s))[0])
733 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
734
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000735class LengthTransparency(unittest.TestCase):
736
737 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000738 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000739 self.assertEqual(len(repeat(None, 50)), 50)
740 self.assertRaises(TypeError, len, repeat(None))
741
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000742class RegressionTests(unittest.TestCase):
743
744 def test_sf_793826(self):
745 # Fix Armin Rigo's successful efforts to wreak havoc
746
747 def mutatingtuple(tuple1, f, tuple2):
748 # this builds a tuple t which is a copy of tuple1,
749 # then calls f(t), then mutates t to be equal to tuple2
750 # (needs len(tuple1) == len(tuple2)).
751 def g(value, first=[1]):
752 if first:
753 del first[:]
754 f(z.next())
755 return value
756 items = list(tuple2)
757 items[1:1] = list(tuple1)
758 gen = imap(g, items)
759 z = izip(*[gen]*len(tuple1))
760 z.next()
761
762 def f(t):
763 global T
764 T = t
765 first[:] = list(T)
766
767 first = []
768 mutatingtuple((1,2,3), f, (4,5,6))
769 second = list(T)
770 self.assertEqual(first, second)
771
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000772
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000773 def test_sf_950057(self):
774 # Make sure that chain() and cycle() catch exceptions immediately
775 # rather than when shifting between input sources
776
777 def gen1():
778 hist.append(0)
779 yield 1
780 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000781 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000782 hist.append(2)
783
784 def gen2(x):
785 hist.append(3)
786 yield 2
787 hist.append(4)
788 if x:
789 raise StopIteration
790
791 hist = []
792 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
793 self.assertEqual(hist, [0,1])
794
795 hist = []
796 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
797 self.assertEqual(hist, [0,1])
798
799 hist = []
800 self.assertRaises(AssertionError, list, cycle(gen1()))
801 self.assertEqual(hist, [0,1])
802
Georg Brandlb84c1372007-01-21 10:28:43 +0000803class SubclassWithKwargsTest(unittest.TestCase):
804 def test_keywords_in_subclass(self):
805 # count is not subclassable...
806 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
807 starmap, islice, takewhile, dropwhile, cycle):
808 class Subclass(cls):
809 def __init__(self, newarg=None, *args):
810 cls.__init__(self, *args)
811 try:
812 Subclass(newarg=1)
813 except TypeError, err:
814 # we expect type errors because of wrong argument count
815 self.failIf("does not take keyword arguments" in err.args[0])
816
817
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000818libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000819
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000820
821>>> amounts = [120.15, 764.05, 823.14]
822>>> for checknum, amount in izip(count(1200), amounts):
823... print 'Check %d is for $%.2f' % (checknum, amount)
824...
825Check 1200 is for $120.15
826Check 1201 is for $764.05
827Check 1202 is for $823.14
828
829>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000830>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
831... print cube
832...
8331
8348
83527
836
837>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000838>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000839... print name.title()
840...
841Alex
842Laura
843Martin
844Walter
845Samuele
846
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000847>>> from operator import itemgetter
848>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000849>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000850>>> for k, g in groupby(di, itemgetter(1)):
851... print k, map(itemgetter(0), g)
852...
8531 ['a', 'c', 'e']
8542 ['b', 'd', 'f']
8553 ['g']
856
Raymond Hettinger734fb572004-01-20 20:04:40 +0000857# Find runs of consecutive numbers using groupby. The key to the solution
858# is differencing with a range so that consecutive numbers all appear in
859# same group.
860>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
861>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
862... print map(operator.itemgetter(1), g)
863...
864[1]
865[4, 5, 6]
866[10]
867[15, 16, 17, 18]
868[22]
869[25, 26, 27, 28]
870
Raymond Hettingera098b332003-09-08 23:58:40 +0000871>>> def take(n, seq):
872... return list(islice(seq, n))
873
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000874>>> def enumerate(iterable):
875... return izip(count(), iterable)
876
877>>> def tabulate(function):
878... "Return function(0), function(1), ..."
879... return imap(function, count())
880
881>>> def iteritems(mapping):
882... return izip(mapping.iterkeys(), mapping.itervalues())
883
884>>> def nth(iterable, n):
885... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000886... return list(islice(iterable, n, n+1))
887
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000888>>> def all(seq, pred=None):
889... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000890... for elem in ifilterfalse(pred, seq):
891... return False
892... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000893
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000894>>> def any(seq, pred=None):
895... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000896... for elem in ifilter(pred, seq):
897... return True
898... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000899
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000900>>> def no(seq, pred=None):
901... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000902... for elem in ifilter(pred, seq):
903... return False
904... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000905
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000906>>> def quantify(seq, pred=None):
907... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000908... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000909
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000910>>> def padnone(seq):
911... "Returns the sequence elements and then returns None indefinitely"
912... return chain(seq, repeat(None))
913
914>>> def ncycles(seq, n):
915... "Returns the sequence elements n times"
916... return chain(*repeat(seq, n))
917
918>>> def dotproduct(vec1, vec2):
919... return sum(imap(operator.mul, vec1, vec2))
920
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000921>>> def flatten(listOfLists):
922... return list(chain(*listOfLists))
923
924>>> def repeatfunc(func, times=None, *args):
925... "Repeat calls to func with specified arguments."
926... " Example: repeatfunc(random.random)"
927... if times is None:
928... return starmap(func, repeat(args))
929... else:
930... return starmap(func, repeat(args, times))
931
Raymond Hettingerd591f662003-10-26 15:34:50 +0000932>>> def pairwise(iterable):
933... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
934... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000935... try:
936... b.next()
937... except StopIteration:
938... pass
939... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000940
941This is not part of the examples but it tests to make sure the definitions
942perform as purported.
943
Raymond Hettingera098b332003-09-08 23:58:40 +0000944>>> take(10, count())
945[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
946
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000947>>> list(enumerate('abc'))
948[(0, 'a'), (1, 'b'), (2, 'c')]
949
950>>> list(islice(tabulate(lambda x: 2*x), 4))
951[0, 2, 4, 6]
952
953>>> nth('abcde', 3)
954['d']
955
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000956>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000957True
958
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000959>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000960False
961
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000962>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000963True
964
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000965>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000966False
967
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000968>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000969True
970
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000971>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000972False
973
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000974>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000097550
976
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000977>>> a = [[1, 2, 3], [4, 5, 6]]
978>>> flatten(a)
979[1, 2, 3, 4, 5, 6]
980
981>>> list(repeatfunc(pow, 5, 2, 3))
982[8, 8, 8, 8, 8]
983
984>>> import random
985>>> take(5, imap(int, repeatfunc(random.random)))
986[0, 0, 0, 0, 0]
987
Raymond Hettingerd591f662003-10-26 15:34:50 +0000988>>> list(pairwise('abcd'))
989[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000990
Raymond Hettingerd591f662003-10-26 15:34:50 +0000991>>> list(pairwise([]))
992[]
993
994>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000995[]
996
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000997>>> list(islice(padnone('abc'), 0, 6))
998['a', 'b', 'c', None, None, None]
999
1000>>> list(ncycles('abc', 3))
1001['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1002
1003>>> dotproduct([1,2,3], [4,5,6])
100432
1005
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001006"""
1007
1008__test__ = {'libreftest' : libreftest}
1009
1010def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001011 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001012 RegressionTests, LengthTransparency,
1013 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001014 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001015
1016 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001017 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001018 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001019 counts = [None] * 5
1020 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001021 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001022 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001023 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001024 print counts
1025
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001026 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001027 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001028
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001029if __name__ == "__main__":
1030 test_main(verbose=True)