blob: bbebbd9558ac2d7c599ef0bf677c22fb75fa5c59 [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')
Thomas Wouterscf297e42007-02-23 15:07:44 +000058 self.assertRaises(OverflowError, list, islice(count(sys.maxint-5), 10))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000059 c = count(3)
60 self.assertEqual(repr(c), 'count(3)')
61 c.next()
62 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +000063 c = count(-9)
64 self.assertEqual(repr(c), 'count(-9)')
65 c.next()
66 self.assertEqual(c.next(), -8)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000067
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000068 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000069 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000070 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000071 self.assertRaises(TypeError, cycle)
72 self.assertRaises(TypeError, cycle, 5)
73 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000074
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000075 def test_groupby(self):
76 # Check whether it accepts arguments correctly
77 self.assertEqual([], list(groupby([])))
78 self.assertEqual([], list(groupby([], key=id)))
79 self.assertRaises(TypeError, list, groupby('abc', []))
80 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000081 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000082
83 # Check normal input
84 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
85 (2,15,22), (3,16,23), (3,17,23)]
86 dup = []
87 for k, g in groupby(s, lambda r:r[0]):
88 for elem in g:
89 self.assertEqual(k, elem[0])
90 dup.append(elem)
91 self.assertEqual(s, dup)
92
93 # Check nested case
94 dup = []
95 for k, g in groupby(s, lambda r:r[0]):
96 for ik, ig in groupby(g, lambda r:r[2]):
97 for elem in ig:
98 self.assertEqual(k, elem[0])
99 self.assertEqual(ik, elem[2])
100 dup.append(elem)
101 self.assertEqual(s, dup)
102
103 # Check case where inner iterator is not used
104 keys = [k for k, g in groupby(s, lambda r:r[0])]
105 expectedkeys = set([r[0] for r in s])
106 self.assertEqual(set(keys), expectedkeys)
107 self.assertEqual(len(keys), len(expectedkeys))
108
109 # Exercise pipes and filters style
110 s = 'abracadabra'
111 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000112 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000113 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
114 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000115 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000116 self.assertEqual(r, ['a', 'b', 'r'])
117 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000118 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000119 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
120 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000121 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000122 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
123
124 # iter.next failure
125 class ExpectedError(Exception):
126 pass
127 def delayed_raise(n=0):
128 for i in range(n):
129 yield 'yo'
130 raise ExpectedError
131 def gulp(iterable, keyp=None, func=list):
132 return [func(g) for k, g in groupby(iterable, keyp)]
133
134 # iter.next failure on outer object
135 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
136 # iter.next failure on inner object
137 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
138
139 # __cmp__ failure
140 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000141 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000142 raise ExpectedError
143 s = [DummyCmp(), DummyCmp(), None]
144
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000145 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000146 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000147 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000148 self.assertRaises(ExpectedError, gulp, s)
149
150 # keyfunc failure
151 def keyfunc(obj):
152 if keyfunc.skip > 0:
153 keyfunc.skip -= 1
154 return obj
155 else:
156 raise ExpectedError
157
158 # keyfunc failure on outer object
159 keyfunc.skip = 0
160 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
161 keyfunc.skip = 1
162 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
163
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000164 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000165 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000166 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000167 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000168 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000169 self.assertRaises(TypeError, ifilter, lambda x:x)
170 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000171 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000172 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000173
174 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000175 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
176 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000177 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000178 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000179 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
180 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000181 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000182 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000183
184 def test_izip(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000185 # XXX This is rather silly now that builtin zip() calls izip()...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000186 ans = [(x,y) for x, y in izip('abc',count())]
187 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Guido van Rossum801f0d72006-08-24 19:48:10 +0000188 self.assertEqual(list(izip('abc', range(6))), lzip('abc', range(6)))
189 self.assertEqual(list(izip('abcdef', range(3))), lzip('abcdef', range(3)))
190 self.assertEqual(take(3,izip('abcdef', count())), lzip('abcdef', range(3)))
191 self.assertEqual(list(izip('abcdef')), lzip('abcdef'))
192 self.assertEqual(list(izip()), lzip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000193 self.assertRaises(TypeError, izip, 3)
194 self.assertRaises(TypeError, izip, range(3), 3)
195 # Check tuple re-use (implementation detail)
196 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000197 lzip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000198 self.assertEqual([pair for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000199 lzip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000200 ids = map(id, izip('abc', 'def'))
201 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000202 ids = map(id, list(izip('abc', 'def')))
203 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000204
Thomas Wouterscf297e42007-02-23 15:07:44 +0000205 def test_iziplongest(self):
206 for args in [
207 ['abc', range(6)],
208 [range(6), 'abc'],
209 [range(1000), range(2000,2100), range(3000,3050)],
210 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
211 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
212 ]:
213 target = map(None, *args)
214 self.assertEqual(list(izip_longest(*args)), target)
215 self.assertEqual(list(izip_longest(*args, **{})), target)
216 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
217 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
218
219 self.assertEqual(take(3,izip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
220
221 self.assertEqual(list(izip_longest()), list(zip()))
222 self.assertEqual(list(izip_longest([])), list(zip([])))
223 self.assertEqual(list(izip_longest('abcdef')), list(zip('abcdef')))
224
225 self.assertEqual(list(izip_longest('abc', 'defg', **{})), map(None, 'abc', 'defg')) # empty keyword dict
226 self.assertRaises(TypeError, izip_longest, 3)
227 self.assertRaises(TypeError, izip_longest, range(3), 3)
228
229 for stmt in [
230 "izip_longest('abc', fv=1)",
231 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
232 ]:
233 try:
234 eval(stmt, globals(), locals())
235 except TypeError:
236 pass
237 else:
238 self.fail('Did not raise Type in: ' + stmt)
239
240 # Check tuple re-use (implementation detail)
241 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
242 list(zip('abc', 'def')))
243 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
244 list(zip('abc', 'def')))
245 ids = map(id, izip_longest('abc', 'def'))
246 self.assertEqual(min(ids), max(ids))
247 ids = map(id, list(izip_longest('abc', 'def')))
248 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
249
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000250 def test_repeat(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000251 self.assertEqual(lzip(xrange(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000252 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000253 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000254 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000255 self.assertEqual(list(repeat('a', 0)), [])
256 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000257 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000258 self.assertRaises(TypeError, repeat, None, 3, 4)
259 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000260 r = repeat(1+0j)
261 self.assertEqual(repr(r), 'repeat((1+0j))')
262 r = repeat(1+0j, 5)
263 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
264 list(r)
265 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000266
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000267 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000268 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
269 [0**1, 1**2, 2**3])
270 self.assertEqual(list(imap(None, 'abc', range(5))),
271 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000272 self.assertEqual(list(imap(None, 'abc', count())),
273 [('a',0),('b',1),('c',2)])
274 self.assertEqual(take(2,imap(None, 'abc', count())),
275 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000276 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000277 self.assertRaises(TypeError, imap)
278 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000279 self.assertRaises(TypeError, imap(10, range(5)).next)
280 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
281 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000282
283 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000284 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
285 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000286 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
287 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000288 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000289 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000290 self.assertRaises(TypeError, starmap)
291 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
292 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
293 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
294 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000295
296 def test_islice(self):
297 for args in [ # islice(args) should agree with range(args)
298 (10, 20, 3),
299 (10, 3, 20),
300 (10, 20),
301 (10, 3),
302 (20,)
303 ]:
304 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
305
306 for args, tgtargs in [ # Stop when seqn is exhausted
307 ((10, 110, 3), ((10, 100, 3))),
308 ((10, 110), ((10, 100))),
309 ((110,), (100,))
310 ]:
311 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
312
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000313 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000314 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000315 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
316 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000317 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
318 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
319
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000320 # Test number of items consumed SF #1171417
321 it = iter(range(10))
322 self.assertEqual(list(islice(it, 3)), range(3))
323 self.assertEqual(list(it), range(3, 10))
324
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000325 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000326 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000327 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
328 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
329 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
330 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
331 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000332 self.assertRaises(ValueError, islice, xrange(10), 'a')
333 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
334 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
335 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
336 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Raymond Hettinger2012f172003-02-07 05:32:58 +0000337 self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000338
339 def test_takewhile(self):
340 data = [1, 3, 5, 20, 2, 4, 6, 8]
341 underten = lambda x: x<10
342 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000343 self.assertEqual(list(takewhile(underten, [])), [])
344 self.assertRaises(TypeError, takewhile)
345 self.assertRaises(TypeError, takewhile, operator.pow)
346 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
347 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
348 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000349 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
350 self.assertEqual(list(t), [1, 1, 1])
351 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000352
353 def test_dropwhile(self):
354 data = [1, 3, 5, 20, 2, 4, 6, 8]
355 underten = lambda x: x<10
356 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000357 self.assertEqual(list(dropwhile(underten, [])), [])
358 self.assertRaises(TypeError, dropwhile)
359 self.assertRaises(TypeError, dropwhile, operator.pow)
360 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
361 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
362 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000363
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000364 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000365 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000366 def irange(n):
367 for i in xrange(n):
368 yield i
369
370 a, b = tee([]) # test empty iterator
371 self.assertEqual(list(a), [])
372 self.assertEqual(list(b), [])
373
374 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000375 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000376
377 a, b = tee(irange(n)) # test 0% interleaved
378 self.assertEqual(list(a), range(n))
379 self.assertEqual(list(b), range(n))
380
381 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000382 for i in xrange(100):
383 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000384 del a
385 self.assertEqual(list(b), range(n))
386
387 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000388 for i in xrange(100):
389 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000390 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000391 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000392
393 for j in xrange(5): # test randomly interleaved
394 order = [0]*n + [1]*n
395 random.shuffle(order)
396 lists = ([], [])
397 its = tee(irange(n))
398 for i in order:
399 value = its[i].next()
400 lists[i].append(value)
401 self.assertEqual(lists[0], range(n))
402 self.assertEqual(lists[1], range(n))
403
Raymond Hettingerad983e72003-11-12 14:32:26 +0000404 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000405 self.assertRaises(TypeError, tee)
406 self.assertRaises(TypeError, tee, 3)
407 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000408 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000409
Raymond Hettingerad983e72003-11-12 14:32:26 +0000410 # tee object should be instantiable
411 a, b = tee('abc')
412 c = type(a)('def')
413 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000414
Raymond Hettingerad983e72003-11-12 14:32:26 +0000415 # test long-lagged and multi-way split
416 a, b, c = tee(xrange(2000), 3)
417 for i in xrange(100):
418 self.assertEqual(a.next(), i)
419 self.assertEqual(list(b), range(2000))
420 self.assertEqual([c.next(), c.next()], range(2))
421 self.assertEqual(list(a), range(100,2000))
422 self.assertEqual(list(c), range(2,2000))
423
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000424 # test values of n
425 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000427 for n in xrange(5):
428 result = tee('abc', n)
429 self.assertEqual(type(result), tuple)
430 self.assertEqual(len(result), n)
431 self.assertEqual(map(list, result), [list('abc')]*n)
432
Raymond Hettingerad983e72003-11-12 14:32:26 +0000433 # tee pass-through to copyable iterator
434 a, b = tee('abc')
435 c, d = tee(a)
436 self.assert_(a is c)
437
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000438 # test tee_new
439 t1, t2 = tee('abc')
440 tnew = type(t1)
441 self.assertRaises(TypeError, tnew)
442 self.assertRaises(TypeError, tnew, 10)
443 t3 = tnew(t1)
444 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000445
Raymond Hettingera9f60922004-10-17 16:40:14 +0000446 # test that tee objects are weak referencable
447 a, b = tee(xrange(10))
448 p = proxy(a)
449 self.assertEqual(getattr(p, '__class__'), type(b))
450 del a
451 self.assertRaises(ReferenceError, getattr, p, '__class__')
452
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000453 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000454 self.assertRaises(StopIteration, izip().next)
455
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000456 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000457 self.assertRaises(StopIteration, f([]).next)
458 self.assertRaises(StopIteration, f(StopNow()).next)
459
460 self.assertRaises(StopIteration, islice([], None).next)
461 self.assertRaises(StopIteration, islice(StopNow(), None).next)
462
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000463 p, q = tee([])
464 self.assertRaises(StopIteration, p.next)
465 self.assertRaises(StopIteration, q.next)
466 p, q = tee(StopNow())
467 self.assertRaises(StopIteration, p.next)
468 self.assertRaises(StopIteration, q.next)
469
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000470 self.assertRaises(StopIteration, repeat(None, 0).next)
471
472 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
473 self.assertRaises(StopIteration, f(lambda x:x, []).next)
474 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
475
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000476class TestGC(unittest.TestCase):
477
478 def makecycle(self, iterator, container):
479 container.append(iterator)
480 iterator.next()
481 del container, iterator
482
483 def test_chain(self):
484 a = []
485 self.makecycle(chain(a), a)
486
487 def test_cycle(self):
488 a = []
489 self.makecycle(cycle([a]*2), a)
490
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000491 def test_dropwhile(self):
492 a = []
493 self.makecycle(dropwhile(bool, [0, a, a]), a)
494
495 def test_groupby(self):
496 a = []
497 self.makecycle(groupby([a]*2, lambda x:x), a)
498
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000499 def test_ifilter(self):
500 a = []
501 self.makecycle(ifilter(lambda x:True, [a]*2), a)
502
503 def test_ifilterfalse(self):
504 a = []
505 self.makecycle(ifilterfalse(lambda x:False, a), a)
506
507 def test_izip(self):
508 a = []
509 self.makecycle(izip([a]*2, [a]*3), a)
510
511 def test_imap(self):
512 a = []
513 self.makecycle(imap(lambda x:x, [a]*2), a)
514
515 def test_islice(self):
516 a = []
517 self.makecycle(islice([a]*2, None), a)
518
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000519 def test_repeat(self):
520 a = []
521 self.makecycle(repeat(a), a)
522
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000523 def test_starmap(self):
524 a = []
525 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
526
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000527 def test_takewhile(self):
528 a = []
529 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
530
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000531def R(seqn):
532 'Regular generator'
533 for i in seqn:
534 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000535
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000536class G:
537 'Sequence using __getitem__'
538 def __init__(self, seqn):
539 self.seqn = seqn
540 def __getitem__(self, i):
541 return self.seqn[i]
542
543class I:
544 'Sequence using iterator protocol'
545 def __init__(self, seqn):
546 self.seqn = seqn
547 self.i = 0
548 def __iter__(self):
549 return self
550 def next(self):
551 if self.i >= len(self.seqn): raise StopIteration
552 v = self.seqn[self.i]
553 self.i += 1
554 return v
555
556class Ig:
557 'Sequence using iterator protocol defined with a generator'
558 def __init__(self, seqn):
559 self.seqn = seqn
560 self.i = 0
561 def __iter__(self):
562 for val in self.seqn:
563 yield val
564
565class X:
566 'Missing __getitem__ and __iter__'
567 def __init__(self, seqn):
568 self.seqn = seqn
569 self.i = 0
570 def next(self):
571 if self.i >= len(self.seqn): raise StopIteration
572 v = self.seqn[self.i]
573 self.i += 1
574 return v
575
576class N:
577 'Iterator missing next()'
578 def __init__(self, seqn):
579 self.seqn = seqn
580 self.i = 0
581 def __iter__(self):
582 return self
583
584class E:
585 'Test propagation of exceptions'
586 def __init__(self, seqn):
587 self.seqn = seqn
588 self.i = 0
589 def __iter__(self):
590 return self
591 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000592 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000593
594class S:
595 'Test immediate stop'
596 def __init__(self, seqn):
597 pass
598 def __iter__(self):
599 return self
600 def next(self):
601 raise StopIteration
602
603def L(seqn):
604 'Test multiple tiers of iterators'
605 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
606
607
608class TestVariousIteratorArgs(unittest.TestCase):
609
610 def test_chain(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):
613 self.assertEqual(list(chain(g(s))), list(g(s)))
614 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
615 self.assertRaises(TypeError, chain, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000616 self.assertRaises(TypeError, chain, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000617 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
618
619 def test_cycle(self):
620 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
621 for g in (G, I, Ig, S, L, R):
622 tgtlen = len(s) * 3
623 expected = list(g(s))*3
624 actual = list(islice(cycle(g(s)), tgtlen))
625 self.assertEqual(actual, expected)
626 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000627 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000628 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
629
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000630 def test_groupby(self):
631 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
632 for g in (G, I, Ig, S, L, R):
633 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
634 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000635 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000636 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
637
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000638 def test_ifilter(self):
639 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
640 for g in (G, I, Ig, S, L, R):
641 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
642 self.assertRaises(TypeError, ifilter, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000643 self.assertRaises(TypeError, ifilter, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000644 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
645
646 def test_ifilterfalse(self):
647 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
648 for g in (G, I, Ig, S, L, R):
649 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
650 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000651 self.assertRaises(TypeError, ifilterfalse, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000652 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
653
654 def test_izip(self):
655 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
656 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000657 self.assertEqual(list(izip(g(s))), lzip(g(s)))
658 self.assertEqual(list(izip(g(s), g(s))), lzip(g(s), g(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000659 self.assertRaises(TypeError, izip, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000660 self.assertRaises(TypeError, izip, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000661 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
662
Thomas Wouterscf297e42007-02-23 15:07:44 +0000663 def test_iziplongest(self):
664 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
665 for g in (G, I, Ig, S, L, R):
666 self.assertEqual(list(izip_longest(g(s))), list(zip(g(s))))
667 self.assertEqual(list(izip_longest(g(s), g(s))), list(zip(g(s), g(s))))
668 self.assertRaises(TypeError, izip_longest, X(s))
669 self.assertRaises(TypeError, izip_longest, N(s))
670 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
671
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000672 def test_imap(self):
673 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
674 for g in (G, I, Ig, S, L, R):
675 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
676 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
677 self.assertRaises(TypeError, imap, onearg, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000678 self.assertRaises(TypeError, imap, onearg, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000679 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
680
681 def test_islice(self):
682 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
683 for g in (G, I, Ig, S, L, R):
684 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
685 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000686 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000687 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
688
689 def test_starmap(self):
690 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
691 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000692 ss = lzip(s, s)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000693 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
694 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000695 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000696 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
697
698 def test_takewhile(self):
699 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
700 for g in (G, I, Ig, S, L, R):
701 tgt = []
702 for elem in g(s):
703 if not isEven(elem): break
704 tgt.append(elem)
705 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
706 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000707 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000708 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
709
710 def test_dropwhile(self):
711 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
712 for g in (G, I, Ig, S, L, R):
713 tgt = []
714 for elem in g(s):
715 if not tgt and isOdd(elem): continue
716 tgt.append(elem)
717 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
718 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000719 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000720 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
721
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000722 def test_tee(self):
723 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
724 for g in (G, I, Ig, S, L, R):
725 it1, it2 = tee(g(s))
726 self.assertEqual(list(it1), list(g(s)))
727 self.assertEqual(list(it2), list(g(s)))
728 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000729 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000730 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
731
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000732class LengthTransparency(unittest.TestCase):
733
734 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000735 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000736 self.assertEqual(len(repeat(None, 50)), 50)
737 self.assertRaises(TypeError, len, repeat(None))
738
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000739class RegressionTests(unittest.TestCase):
740
741 def test_sf_793826(self):
742 # Fix Armin Rigo's successful efforts to wreak havoc
743
744 def mutatingtuple(tuple1, f, tuple2):
745 # this builds a tuple t which is a copy of tuple1,
746 # then calls f(t), then mutates t to be equal to tuple2
747 # (needs len(tuple1) == len(tuple2)).
748 def g(value, first=[1]):
749 if first:
750 del first[:]
751 f(z.next())
752 return value
753 items = list(tuple2)
754 items[1:1] = list(tuple1)
755 gen = imap(g, items)
756 z = izip(*[gen]*len(tuple1))
757 z.next()
758
759 def f(t):
760 global T
761 T = t
762 first[:] = list(T)
763
764 first = []
765 mutatingtuple((1,2,3), f, (4,5,6))
766 second = list(T)
767 self.assertEqual(first, second)
768
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000769
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000770 def test_sf_950057(self):
771 # Make sure that chain() and cycle() catch exceptions immediately
772 # rather than when shifting between input sources
773
774 def gen1():
775 hist.append(0)
776 yield 1
777 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000778 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000779 hist.append(2)
780
781 def gen2(x):
782 hist.append(3)
783 yield 2
784 hist.append(4)
785 if x:
786 raise StopIteration
787
788 hist = []
789 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
790 self.assertEqual(hist, [0,1])
791
792 hist = []
793 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
794 self.assertEqual(hist, [0,1])
795
796 hist = []
797 self.assertRaises(AssertionError, list, cycle(gen1()))
798 self.assertEqual(hist, [0,1])
799
Thomas Woutersb2137042007-02-01 18:02:27 +0000800class SubclassWithKwargsTest(unittest.TestCase):
801 def test_keywords_in_subclass(self):
802 # count is not subclassable...
803 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
804 starmap, islice, takewhile, dropwhile, cycle):
805 class Subclass(cls):
806 def __init__(self, newarg=None, *args):
807 cls.__init__(self, *args)
808 try:
809 Subclass(newarg=1)
810 except TypeError as err:
811 # we expect type errors because of wrong argument count
812 self.failIf("does not take keyword arguments" in err.args[0])
813
814
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000815libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000816
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000817
818>>> amounts = [120.15, 764.05, 823.14]
819>>> for checknum, amount in izip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +0000820... print('Check %d is for $%.2f' % (checknum, amount))
821...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000822Check 1200 is for $120.15
823Check 1201 is for $764.05
824Check 1202 is for $823.14
825
826>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000827>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +0000828... print(cube)
829...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00008301
8318
83227
833
834>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000835>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +0000836... print(name.title())
837...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000838Alex
839Laura
840Martin
841Walter
842Samuele
843
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000844>>> from operator import itemgetter
845>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000846>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000847>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossum7131f842007-02-09 20:13:25 +0000848... print(k, map(itemgetter(0), g))
849...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00008501 ['a', 'c', 'e']
8512 ['b', 'd', 'f']
8523 ['g']
853
Raymond Hettinger734fb572004-01-20 20:04:40 +0000854# Find runs of consecutive numbers using groupby. The key to the solution
855# is differencing with a range so that consecutive numbers all appear in
856# same group.
857>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
858>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
Guido van Rossum7131f842007-02-09 20:13:25 +0000859... print(map(operator.itemgetter(1), g))
860...
Raymond Hettinger734fb572004-01-20 20:04:40 +0000861[1]
862[4, 5, 6]
863[10]
864[15, 16, 17, 18]
865[22]
866[25, 26, 27, 28]
867
Raymond Hettingera098b332003-09-08 23:58:40 +0000868>>> def take(n, seq):
869... return list(islice(seq, n))
870
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000871>>> def enumerate(iterable):
872... return izip(count(), iterable)
873
874>>> def tabulate(function):
875... "Return function(0), function(1), ..."
876... return imap(function, count())
877
878>>> def iteritems(mapping):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000879... return izip(mapping.keys(), mapping.values())
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000880
881>>> def nth(iterable, n):
882... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000883... return list(islice(iterable, n, n+1))
884
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000885>>> def all(seq, pred=None):
886... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000887... for elem in ifilterfalse(pred, seq):
888... return False
889... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000890
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000891>>> def any(seq, pred=None):
892... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000893... for elem in ifilter(pred, seq):
894... return True
895... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000896
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000897>>> def no(seq, pred=None):
898... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000899... for elem in ifilter(pred, seq):
900... return False
901... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000902
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000903>>> def quantify(seq, pred=None):
904... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000905... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000906
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000907>>> def padnone(seq):
908... "Returns the sequence elements and then returns None indefinitely"
909... return chain(seq, repeat(None))
910
911>>> def ncycles(seq, n):
912... "Returns the sequence elements n times"
913... return chain(*repeat(seq, n))
914
915>>> def dotproduct(vec1, vec2):
916... return sum(imap(operator.mul, vec1, vec2))
917
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000918>>> def flatten(listOfLists):
919... return list(chain(*listOfLists))
920
921>>> def repeatfunc(func, times=None, *args):
922... "Repeat calls to func with specified arguments."
923... " Example: repeatfunc(random.random)"
924... if times is None:
925... return starmap(func, repeat(args))
926... else:
927... return starmap(func, repeat(args, times))
928
Raymond Hettingerd591f662003-10-26 15:34:50 +0000929>>> def pairwise(iterable):
930... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
931... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000932... try:
933... b.next()
934... except StopIteration:
935... pass
936... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000937
938This is not part of the examples but it tests to make sure the definitions
939perform as purported.
940
Raymond Hettingera098b332003-09-08 23:58:40 +0000941>>> take(10, count())
942[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
943
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000944>>> list(enumerate('abc'))
945[(0, 'a'), (1, 'b'), (2, 'c')]
946
947>>> list(islice(tabulate(lambda x: 2*x), 4))
948[0, 2, 4, 6]
949
950>>> nth('abcde', 3)
951['d']
952
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000953>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000954True
955
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000956>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000957False
958
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000959>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000960True
961
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000962>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000963False
964
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000965>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000966True
967
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000968>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000969False
970
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000971>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000097250
973
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000974>>> a = [[1, 2, 3], [4, 5, 6]]
975>>> flatten(a)
976[1, 2, 3, 4, 5, 6]
977
978>>> list(repeatfunc(pow, 5, 2, 3))
979[8, 8, 8, 8, 8]
980
981>>> import random
982>>> take(5, imap(int, repeatfunc(random.random)))
983[0, 0, 0, 0, 0]
984
Raymond Hettingerd591f662003-10-26 15:34:50 +0000985>>> list(pairwise('abcd'))
986[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000987
Raymond Hettingerd591f662003-10-26 15:34:50 +0000988>>> list(pairwise([]))
989[]
990
991>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000992[]
993
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000994>>> list(islice(padnone('abc'), 0, 6))
995['a', 'b', 'c', None, None, None]
996
997>>> list(ncycles('abc', 3))
998['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
999
1000>>> dotproduct([1,2,3], [4,5,6])
100132
1002
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001003"""
1004
1005__test__ = {'libreftest' : libreftest}
1006
1007def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001008 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001009 RegressionTests, LengthTransparency,
1010 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001011 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001012
1013 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001014 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001015 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001016 counts = [None] * 5
1017 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001018 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001019 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001020 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001021 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001022
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001023 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001024 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001025
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001026if __name__ == "__main__":
1027 test_main(verbose=True)