blob: 6c362ad0e0c375119742fb17bf3da7c17896d1e1 [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 Hettinger96ef8112003-02-01 00:10:11 +000055 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000056 self.assertRaises(TypeError, count, 'a')
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +000057 self.assertRaises(OverflowError, list, islice(count(maxsize-5), 10))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000058 c = count(3)
59 self.assertEqual(repr(c), 'count(3)')
60 c.next()
61 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +000062 c = count(-9)
63 self.assertEqual(repr(c), 'count(-9)')
64 c.next()
65 self.assertEqual(c.next(), -8)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000066
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000067 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000068 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000069 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000070 self.assertRaises(TypeError, cycle)
71 self.assertRaises(TypeError, cycle, 5)
72 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000073
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000074 def test_groupby(self):
75 # Check whether it accepts arguments correctly
76 self.assertEqual([], list(groupby([])))
77 self.assertEqual([], list(groupby([], key=id)))
78 self.assertRaises(TypeError, list, groupby('abc', []))
79 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000080 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000081
82 # Check normal input
83 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
84 (2,15,22), (3,16,23), (3,17,23)]
85 dup = []
86 for k, g in groupby(s, lambda r:r[0]):
87 for elem in g:
88 self.assertEqual(k, elem[0])
89 dup.append(elem)
90 self.assertEqual(s, dup)
91
92 # Check nested case
93 dup = []
94 for k, g in groupby(s, lambda r:r[0]):
95 for ik, ig in groupby(g, lambda r:r[2]):
96 for elem in ig:
97 self.assertEqual(k, elem[0])
98 self.assertEqual(ik, elem[2])
99 dup.append(elem)
100 self.assertEqual(s, dup)
101
102 # Check case where inner iterator is not used
103 keys = [k for k, g in groupby(s, lambda r:r[0])]
104 expectedkeys = set([r[0] for r in s])
105 self.assertEqual(set(keys), expectedkeys)
106 self.assertEqual(len(keys), len(expectedkeys))
107
108 # Exercise pipes and filters style
109 s = 'abracadabra'
110 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000111 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000112 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
113 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000114 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000115 self.assertEqual(r, ['a', 'b', 'r'])
116 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000117 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000118 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
119 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000120 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000121 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
122
123 # iter.next failure
124 class ExpectedError(Exception):
125 pass
126 def delayed_raise(n=0):
127 for i in range(n):
128 yield 'yo'
129 raise ExpectedError
130 def gulp(iterable, keyp=None, func=list):
131 return [func(g) for k, g in groupby(iterable, keyp)]
132
133 # iter.next failure on outer object
134 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
135 # iter.next failure on inner object
136 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
137
138 # __cmp__ failure
139 class DummyCmp:
140 def __cmp__(self, dst):
141 raise ExpectedError
142 s = [DummyCmp(), DummyCmp(), None]
143
144 # __cmp__ failure on outer object
145 self.assertRaises(ExpectedError, gulp, s, func=id)
146 # __cmp__ failure on inner object
147 self.assertRaises(ExpectedError, gulp, s)
148
149 # keyfunc failure
150 def keyfunc(obj):
151 if keyfunc.skip > 0:
152 keyfunc.skip -= 1
153 return obj
154 else:
155 raise ExpectedError
156
157 # keyfunc failure on outer object
158 keyfunc.skip = 0
159 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
160 keyfunc.skip = 1
161 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
162
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000163 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000164 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000165 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000166 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000167 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000168 self.assertRaises(TypeError, ifilter, lambda x:x)
169 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000170 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000171 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000172
173 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000174 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
175 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000176 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000177 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000178 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
179 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000180 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000181 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000182
183 def test_izip(self):
184 ans = [(x,y) for x, y in izip('abc',count())]
185 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000186 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
187 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000188 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000189 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000190 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000191 self.assertRaises(TypeError, izip, 3)
192 self.assertRaises(TypeError, izip, range(3), 3)
193 # Check tuple re-use (implementation detail)
194 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
195 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000196 self.assertEqual([pair for pair in izip('abc', 'def')],
197 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000198 ids = map(id, izip('abc', 'def'))
199 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000200 ids = map(id, list(izip('abc', 'def')))
201 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000202
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000203 def test_iziplongest(self):
204 for args in [
205 ['abc', range(6)],
206 [range(6), 'abc'],
207 [range(1000), range(2000,2100), range(3000,3050)],
208 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
209 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
210 ]:
211 target = map(None, *args)
212 self.assertEqual(list(izip_longest(*args)), target)
213 self.assertEqual(list(izip_longest(*args, **{})), target)
214 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
215 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000216
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000217 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
218
219 self.assertEqual(list(izip_longest()), zip())
220 self.assertEqual(list(izip_longest([])), zip([]))
221 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000222
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000223 self.assertEqual(list(izip_longest('abc', 'defg', **{})), map(None, 'abc', 'defg')) # empty keyword dict
224 self.assertRaises(TypeError, izip_longest, 3)
225 self.assertRaises(TypeError, izip_longest, range(3), 3)
226
227 for stmt in [
228 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000229 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000230 ]:
231 try:
232 eval(stmt, globals(), locals())
233 except TypeError:
234 pass
235 else:
236 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000237
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000238 # Check tuple re-use (implementation detail)
239 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
240 zip('abc', 'def'))
241 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
242 zip('abc', 'def'))
243 ids = map(id, izip_longest('abc', 'def'))
244 self.assertEqual(min(ids), max(ids))
245 ids = map(id, list(izip_longest('abc', 'def')))
246 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
247
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000248 def test_repeat(self):
249 self.assertEqual(zip(xrange(3),repeat('a')),
250 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000251 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000252 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000253 self.assertEqual(list(repeat('a', 0)), [])
254 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000255 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000256 self.assertRaises(TypeError, repeat, None, 3, 4)
257 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000258 r = repeat(1+0j)
259 self.assertEqual(repr(r), 'repeat((1+0j))')
260 r = repeat(1+0j, 5)
261 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
262 list(r)
263 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000264
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000265 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000266 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
267 [0**1, 1**2, 2**3])
268 self.assertEqual(list(imap(None, 'abc', range(5))),
269 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000270 self.assertEqual(list(imap(None, 'abc', count())),
271 [('a',0),('b',1),('c',2)])
272 self.assertEqual(take(2,imap(None, 'abc', count())),
273 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000274 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000275 self.assertRaises(TypeError, imap)
276 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000277 self.assertRaises(TypeError, imap(10, range(5)).next)
278 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
279 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000280
281 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000282 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
283 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000284 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
285 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000286 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000287 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000288 self.assertRaises(TypeError, starmap)
289 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
290 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
291 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
292 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000293
294 def test_islice(self):
295 for args in [ # islice(args) should agree with range(args)
296 (10, 20, 3),
297 (10, 3, 20),
298 (10, 20),
299 (10, 3),
300 (20,)
301 ]:
302 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
303
304 for args, tgtargs in [ # Stop when seqn is exhausted
305 ((10, 110, 3), ((10, 100, 3))),
306 ((10, 110), ((10, 100))),
307 ((110,), (100,))
308 ]:
309 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
310
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000311 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000312 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000313 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
314 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000315 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
316 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
317
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000318 # Test number of items consumed SF #1171417
319 it = iter(range(10))
320 self.assertEqual(list(islice(it, 3)), range(3))
321 self.assertEqual(list(it), range(3, 10))
322
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000323 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000324 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000325 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
326 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
327 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
328 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
329 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000330 self.assertRaises(ValueError, islice, xrange(10), 'a')
331 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
332 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
333 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
334 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000335 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000336
337 def test_takewhile(self):
338 data = [1, 3, 5, 20, 2, 4, 6, 8]
339 underten = lambda x: x<10
340 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000341 self.assertEqual(list(takewhile(underten, [])), [])
342 self.assertRaises(TypeError, takewhile)
343 self.assertRaises(TypeError, takewhile, operator.pow)
344 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
345 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
346 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000347 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
348 self.assertEqual(list(t), [1, 1, 1])
349 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000350
351 def test_dropwhile(self):
352 data = [1, 3, 5, 20, 2, 4, 6, 8]
353 underten = lambda x: x<10
354 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000355 self.assertEqual(list(dropwhile(underten, [])), [])
356 self.assertRaises(TypeError, dropwhile)
357 self.assertRaises(TypeError, dropwhile, operator.pow)
358 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
359 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
360 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000361
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000362 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000363 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000364 def irange(n):
365 for i in xrange(n):
366 yield i
367
368 a, b = tee([]) # test empty iterator
369 self.assertEqual(list(a), [])
370 self.assertEqual(list(b), [])
371
372 a, b = tee(irange(n)) # test 100% interleaved
373 self.assertEqual(zip(a,b), zip(range(n),range(n)))
374
375 a, b = tee(irange(n)) # test 0% interleaved
376 self.assertEqual(list(a), range(n))
377 self.assertEqual(list(b), range(n))
378
379 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000380 for i in xrange(100):
381 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000382 del a
383 self.assertEqual(list(b), range(n))
384
385 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000386 for i in xrange(100):
387 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000388 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000389 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000390
391 for j in xrange(5): # test randomly interleaved
392 order = [0]*n + [1]*n
393 random.shuffle(order)
394 lists = ([], [])
395 its = tee(irange(n))
396 for i in order:
397 value = its[i].next()
398 lists[i].append(value)
399 self.assertEqual(lists[0], range(n))
400 self.assertEqual(lists[1], range(n))
401
Raymond Hettingerad983e72003-11-12 14:32:26 +0000402 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000403 self.assertRaises(TypeError, tee)
404 self.assertRaises(TypeError, tee, 3)
405 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000406 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000407
Raymond Hettingerad983e72003-11-12 14:32:26 +0000408 # tee object should be instantiable
409 a, b = tee('abc')
410 c = type(a)('def')
411 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000412
Raymond Hettingerad983e72003-11-12 14:32:26 +0000413 # test long-lagged and multi-way split
414 a, b, c = tee(xrange(2000), 3)
415 for i in xrange(100):
416 self.assertEqual(a.next(), i)
417 self.assertEqual(list(b), range(2000))
418 self.assertEqual([c.next(), c.next()], range(2))
419 self.assertEqual(list(a), range(100,2000))
420 self.assertEqual(list(c), range(2,2000))
421
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000422 # test values of n
423 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000424 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000425 for n in xrange(5):
426 result = tee('abc', n)
427 self.assertEqual(type(result), tuple)
428 self.assertEqual(len(result), n)
429 self.assertEqual(map(list, result), [list('abc')]*n)
430
Raymond Hettingerad983e72003-11-12 14:32:26 +0000431 # tee pass-through to copyable iterator
432 a, b = tee('abc')
433 c, d = tee(a)
434 self.assert_(a is c)
435
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000436 # test tee_new
437 t1, t2 = tee('abc')
438 tnew = type(t1)
439 self.assertRaises(TypeError, tnew)
440 self.assertRaises(TypeError, tnew, 10)
441 t3 = tnew(t1)
442 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000443
Raymond Hettingera9f60922004-10-17 16:40:14 +0000444 # test that tee objects are weak referencable
445 a, b = tee(xrange(10))
446 p = proxy(a)
447 self.assertEqual(getattr(p, '__class__'), type(b))
448 del a
449 self.assertRaises(ReferenceError, getattr, p, '__class__')
450
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000451 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000452 self.assertRaises(StopIteration, izip().next)
453
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000454 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000455 self.assertRaises(StopIteration, f([]).next)
456 self.assertRaises(StopIteration, f(StopNow()).next)
457
458 self.assertRaises(StopIteration, islice([], None).next)
459 self.assertRaises(StopIteration, islice(StopNow(), None).next)
460
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000461 p, q = tee([])
462 self.assertRaises(StopIteration, p.next)
463 self.assertRaises(StopIteration, q.next)
464 p, q = tee(StopNow())
465 self.assertRaises(StopIteration, p.next)
466 self.assertRaises(StopIteration, q.next)
467
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000468 self.assertRaises(StopIteration, repeat(None, 0).next)
469
470 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
471 self.assertRaises(StopIteration, f(lambda x:x, []).next)
472 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
473
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000474class TestGC(unittest.TestCase):
475
476 def makecycle(self, iterator, container):
477 container.append(iterator)
478 iterator.next()
479 del container, iterator
480
481 def test_chain(self):
482 a = []
483 self.makecycle(chain(a), a)
484
485 def test_cycle(self):
486 a = []
487 self.makecycle(cycle([a]*2), a)
488
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000489 def test_dropwhile(self):
490 a = []
491 self.makecycle(dropwhile(bool, [0, a, a]), a)
492
493 def test_groupby(self):
494 a = []
495 self.makecycle(groupby([a]*2, lambda x:x), a)
496
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000497 def test_ifilter(self):
498 a = []
499 self.makecycle(ifilter(lambda x:True, [a]*2), a)
500
501 def test_ifilterfalse(self):
502 a = []
503 self.makecycle(ifilterfalse(lambda x:False, a), a)
504
505 def test_izip(self):
506 a = []
507 self.makecycle(izip([a]*2, [a]*3), a)
508
509 def test_imap(self):
510 a = []
511 self.makecycle(imap(lambda x:x, [a]*2), a)
512
513 def test_islice(self):
514 a = []
515 self.makecycle(islice([a]*2, None), a)
516
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000517 def test_repeat(self):
518 a = []
519 self.makecycle(repeat(a), a)
520
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000521 def test_starmap(self):
522 a = []
523 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
524
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000525 def test_takewhile(self):
526 a = []
527 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
528
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000529def R(seqn):
530 'Regular generator'
531 for i in seqn:
532 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000533
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000534class G:
535 'Sequence using __getitem__'
536 def __init__(self, seqn):
537 self.seqn = seqn
538 def __getitem__(self, i):
539 return self.seqn[i]
540
541class I:
542 'Sequence using iterator protocol'
543 def __init__(self, seqn):
544 self.seqn = seqn
545 self.i = 0
546 def __iter__(self):
547 return self
548 def next(self):
549 if self.i >= len(self.seqn): raise StopIteration
550 v = self.seqn[self.i]
551 self.i += 1
552 return v
553
554class Ig:
555 'Sequence using iterator protocol defined with a generator'
556 def __init__(self, seqn):
557 self.seqn = seqn
558 self.i = 0
559 def __iter__(self):
560 for val in self.seqn:
561 yield val
562
563class X:
564 'Missing __getitem__ and __iter__'
565 def __init__(self, seqn):
566 self.seqn = seqn
567 self.i = 0
568 def next(self):
569 if self.i >= len(self.seqn): raise StopIteration
570 v = self.seqn[self.i]
571 self.i += 1
572 return v
573
574class N:
575 'Iterator missing next()'
576 def __init__(self, seqn):
577 self.seqn = seqn
578 self.i = 0
579 def __iter__(self):
580 return self
581
582class E:
583 'Test propagation of exceptions'
584 def __init__(self, seqn):
585 self.seqn = seqn
586 self.i = 0
587 def __iter__(self):
588 return self
589 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000590 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000591
592class S:
593 'Test immediate stop'
594 def __init__(self, seqn):
595 pass
596 def __iter__(self):
597 return self
598 def next(self):
599 raise StopIteration
600
601def L(seqn):
602 'Test multiple tiers of iterators'
603 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
604
605
606class TestVariousIteratorArgs(unittest.TestCase):
607
608 def test_chain(self):
609 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
610 for g in (G, I, Ig, S, L, R):
611 self.assertEqual(list(chain(g(s))), list(g(s)))
612 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
613 self.assertRaises(TypeError, chain, X(s))
614 self.assertRaises(TypeError, list, chain(N(s)))
615 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
616
617 def test_cycle(self):
618 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
619 for g in (G, I, Ig, S, L, R):
620 tgtlen = len(s) * 3
621 expected = list(g(s))*3
622 actual = list(islice(cycle(g(s)), tgtlen))
623 self.assertEqual(actual, expected)
624 self.assertRaises(TypeError, cycle, X(s))
625 self.assertRaises(TypeError, list, cycle(N(s)))
626 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
627
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000628 def test_groupby(self):
629 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
630 for g in (G, I, Ig, S, L, R):
631 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
632 self.assertRaises(TypeError, groupby, X(s))
633 self.assertRaises(TypeError, list, groupby(N(s)))
634 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
635
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000636 def test_ifilter(self):
637 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
638 for g in (G, I, Ig, S, L, R):
639 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
640 self.assertRaises(TypeError, ifilter, isEven, X(s))
641 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
642 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
643
644 def test_ifilterfalse(self):
645 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
646 for g in (G, I, Ig, S, L, R):
647 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
648 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
649 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
650 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
651
652 def test_izip(self):
653 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
654 for g in (G, I, Ig, S, L, R):
655 self.assertEqual(list(izip(g(s))), zip(g(s)))
656 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
657 self.assertRaises(TypeError, izip, X(s))
658 self.assertRaises(TypeError, list, izip(N(s)))
659 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
660
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000661 def test_iziplongest(self):
662 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
663 for g in (G, I, Ig, S, L, R):
664 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
665 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
666 self.assertRaises(TypeError, izip_longest, X(s))
667 self.assertRaises(TypeError, list, izip_longest(N(s)))
668 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
669
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000670 def test_imap(self):
671 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
672 for g in (G, I, Ig, S, L, R):
673 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
674 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
675 self.assertRaises(TypeError, imap, onearg, X(s))
676 self.assertRaises(TypeError, list, imap(onearg, N(s)))
677 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
678
679 def test_islice(self):
680 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
681 for g in (G, I, Ig, S, L, R):
682 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
683 self.assertRaises(TypeError, islice, X(s), 10)
684 self.assertRaises(TypeError, list, islice(N(s), 10))
685 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
686
687 def test_starmap(self):
688 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
689 for g in (G, I, Ig, S, L, R):
690 ss = zip(s, s)
691 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
692 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
693 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
694 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
695
696 def test_takewhile(self):
697 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
698 for g in (G, I, Ig, S, L, R):
699 tgt = []
700 for elem in g(s):
701 if not isEven(elem): break
702 tgt.append(elem)
703 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
704 self.assertRaises(TypeError, takewhile, isEven, X(s))
705 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
706 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
707
708 def test_dropwhile(self):
709 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
710 for g in (G, I, Ig, S, L, R):
711 tgt = []
712 for elem in g(s):
713 if not tgt and isOdd(elem): continue
714 tgt.append(elem)
715 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
716 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
717 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
718 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
719
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000720 def test_tee(self):
721 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
722 for g in (G, I, Ig, S, L, R):
723 it1, it2 = tee(g(s))
724 self.assertEqual(list(it1), list(g(s)))
725 self.assertEqual(list(it2), list(g(s)))
726 self.assertRaises(TypeError, tee, X(s))
727 self.assertRaises(TypeError, list, tee(N(s))[0])
728 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
729
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000730class LengthTransparency(unittest.TestCase):
731
732 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000733 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000734 self.assertEqual(len(repeat(None, 50)), 50)
735 self.assertRaises(TypeError, len, repeat(None))
736
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000737class RegressionTests(unittest.TestCase):
738
739 def test_sf_793826(self):
740 # Fix Armin Rigo's successful efforts to wreak havoc
741
742 def mutatingtuple(tuple1, f, tuple2):
743 # this builds a tuple t which is a copy of tuple1,
744 # then calls f(t), then mutates t to be equal to tuple2
745 # (needs len(tuple1) == len(tuple2)).
746 def g(value, first=[1]):
747 if first:
748 del first[:]
749 f(z.next())
750 return value
751 items = list(tuple2)
752 items[1:1] = list(tuple1)
753 gen = imap(g, items)
754 z = izip(*[gen]*len(tuple1))
755 z.next()
756
757 def f(t):
758 global T
759 T = t
760 first[:] = list(T)
761
762 first = []
763 mutatingtuple((1,2,3), f, (4,5,6))
764 second = list(T)
765 self.assertEqual(first, second)
766
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000767
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000768 def test_sf_950057(self):
769 # Make sure that chain() and cycle() catch exceptions immediately
770 # rather than when shifting between input sources
771
772 def gen1():
773 hist.append(0)
774 yield 1
775 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000776 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000777 hist.append(2)
778
779 def gen2(x):
780 hist.append(3)
781 yield 2
782 hist.append(4)
783 if x:
784 raise StopIteration
785
786 hist = []
787 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
788 self.assertEqual(hist, [0,1])
789
790 hist = []
791 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
792 self.assertEqual(hist, [0,1])
793
794 hist = []
795 self.assertRaises(AssertionError, list, cycle(gen1()))
796 self.assertEqual(hist, [0,1])
797
Georg Brandlb84c1372007-01-21 10:28:43 +0000798class SubclassWithKwargsTest(unittest.TestCase):
799 def test_keywords_in_subclass(self):
800 # count is not subclassable...
801 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
802 starmap, islice, takewhile, dropwhile, cycle):
803 class Subclass(cls):
804 def __init__(self, newarg=None, *args):
805 cls.__init__(self, *args)
806 try:
807 Subclass(newarg=1)
808 except TypeError, err:
809 # we expect type errors because of wrong argument count
810 self.failIf("does not take keyword arguments" in err.args[0])
811
812
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000813libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000814
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000815
816>>> amounts = [120.15, 764.05, 823.14]
817>>> for checknum, amount in izip(count(1200), amounts):
818... print 'Check %d is for $%.2f' % (checknum, amount)
819...
820Check 1200 is for $120.15
821Check 1201 is for $764.05
822Check 1202 is for $823.14
823
824>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000825>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
826... print cube
827...
8281
8298
83027
831
832>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000833>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000834... print name.title()
835...
836Alex
837Laura
838Martin
839Walter
840Samuele
841
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000842>>> from operator import itemgetter
843>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000844>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000845>>> for k, g in groupby(di, itemgetter(1)):
846... print k, map(itemgetter(0), g)
847...
8481 ['a', 'c', 'e']
8492 ['b', 'd', 'f']
8503 ['g']
851
Raymond Hettinger734fb572004-01-20 20:04:40 +0000852# Find runs of consecutive numbers using groupby. The key to the solution
853# is differencing with a range so that consecutive numbers all appear in
854# same group.
855>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
856>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
857... print map(operator.itemgetter(1), g)
858...
859[1]
860[4, 5, 6]
861[10]
862[15, 16, 17, 18]
863[22]
864[25, 26, 27, 28]
865
Raymond Hettingera098b332003-09-08 23:58:40 +0000866>>> def take(n, seq):
867... return list(islice(seq, n))
868
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000869>>> def enumerate(iterable):
870... return izip(count(), iterable)
871
872>>> def tabulate(function):
873... "Return function(0), function(1), ..."
874... return imap(function, count())
875
876>>> def iteritems(mapping):
877... return izip(mapping.iterkeys(), mapping.itervalues())
878
879>>> def nth(iterable, n):
880... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000881... return list(islice(iterable, n, n+1))
882
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000883>>> def all(seq, pred=None):
884... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000885... for elem in ifilterfalse(pred, seq):
886... return False
887... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000888
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000889>>> def any(seq, pred=None):
890... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000891... for elem in ifilter(pred, seq):
892... return True
893... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000894
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000895>>> def no(seq, pred=None):
896... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000897... for elem in ifilter(pred, seq):
898... return False
899... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000900
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000901>>> def quantify(seq, pred=None):
902... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000903... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000904
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000905>>> def padnone(seq):
906... "Returns the sequence elements and then returns None indefinitely"
907... return chain(seq, repeat(None))
908
909>>> def ncycles(seq, n):
910... "Returns the sequence elements n times"
911... return chain(*repeat(seq, n))
912
913>>> def dotproduct(vec1, vec2):
914... return sum(imap(operator.mul, vec1, vec2))
915
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000916>>> def flatten(listOfLists):
917... return list(chain(*listOfLists))
918
919>>> def repeatfunc(func, times=None, *args):
920... "Repeat calls to func with specified arguments."
921... " Example: repeatfunc(random.random)"
922... if times is None:
923... return starmap(func, repeat(args))
924... else:
925... return starmap(func, repeat(args, times))
926
Raymond Hettingerd591f662003-10-26 15:34:50 +0000927>>> def pairwise(iterable):
928... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
929... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000930... try:
931... b.next()
932... except StopIteration:
933... pass
934... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000935
936This is not part of the examples but it tests to make sure the definitions
937perform as purported.
938
Raymond Hettingera098b332003-09-08 23:58:40 +0000939>>> take(10, count())
940[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
941
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000942>>> list(enumerate('abc'))
943[(0, 'a'), (1, 'b'), (2, 'c')]
944
945>>> list(islice(tabulate(lambda x: 2*x), 4))
946[0, 2, 4, 6]
947
948>>> nth('abcde', 3)
949['d']
950
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000951>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000952True
953
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000954>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000955False
956
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000957>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000958True
959
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000960>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000961False
962
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000963>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000964True
965
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000966>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000967False
968
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000969>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000097050
971
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000972>>> a = [[1, 2, 3], [4, 5, 6]]
973>>> flatten(a)
974[1, 2, 3, 4, 5, 6]
975
976>>> list(repeatfunc(pow, 5, 2, 3))
977[8, 8, 8, 8, 8]
978
979>>> import random
980>>> take(5, imap(int, repeatfunc(random.random)))
981[0, 0, 0, 0, 0]
982
Raymond Hettingerd591f662003-10-26 15:34:50 +0000983>>> list(pairwise('abcd'))
984[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000985
Raymond Hettingerd591f662003-10-26 15:34:50 +0000986>>> list(pairwise([]))
987[]
988
989>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000990[]
991
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000992>>> list(islice(padnone('abc'), 0, 6))
993['a', 'b', 'c', None, None, None]
994
995>>> list(ncycles('abc', 3))
996['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
997
998>>> dotproduct([1,2,3], [4,5,6])
99932
1000
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001001"""
1002
1003__test__ = {'libreftest' : libreftest}
1004
1005def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001006 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001007 RegressionTests, LengthTransparency,
1008 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001009 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001010
1011 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001012 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001013 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001014 counts = [None] * 5
1015 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001016 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001017 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001018 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001019 print counts
1020
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001021 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001022 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001023
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001024if __name__ == "__main__":
1025 test_main(verbose=True)