blob: 928f4896c0867322b7b8982de5bf926e17290014 [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
Christian Heimesc3f30c42008-02-22 16:37:40 +00008from functools import reduce
Guido van Rossum360e4b82007-05-14 22:51:27 +00009maxsize = test_support.MAX_Py_ssize_t
10minsize = -maxsize-1
Raymond Hettinger17301e92008-03-13 00:19:26 +000011ifilter = filter
Raymond Hettingera6c60372008-03-13 01:26:19 +000012imap = map
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000013
Guido van Rossum801f0d72006-08-24 19:48:10 +000014def lzip(*args):
15 return list(zip(*args))
16
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000017def onearg(x):
18 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000019 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000020
21def errfunc(*args):
22 'Test function that raises an error'
23 raise ValueError
24
25def gen3():
26 'Non-restartable source sequence'
27 for i in (0, 1, 2):
28 yield i
29
30def isEven(x):
31 'Test predicate'
32 return x%2==0
33
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000034def isOdd(x):
35 'Test predicate'
36 return x%2==1
37
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000038class StopNow:
39 'Class emulating an empty iterable.'
40 def __iter__(self):
41 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000042 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000043 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000044
Raymond Hettinger02420702003-06-29 20:36:23 +000045def take(n, seq):
46 'Convenience function for partially consuming a long of infinite iterable'
47 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000048
Christian Heimes78644762008-03-04 23:39:23 +000049def prod(iterable):
50 return reduce(operator.mul, iterable, 1)
51
Christian Heimes380f7f22008-02-28 11:19:05 +000052def fact(n):
53 'Factorial'
Christian Heimes78644762008-03-04 23:39:23 +000054 return prod(range(1, n+1))
55
56def permutations(iterable, r=None):
57 # XXX use this until real permutations code is added
58 pool = tuple(iterable)
59 n = len(pool)
60 r = n if r is None else r
61 for indices in product(range(n), repeat=r):
62 if len(set(indices)) == r:
63 yield tuple(pool[i] for i in indices)
Christian Heimes380f7f22008-02-28 11:19:05 +000064
Raymond Hettinger96ef8112003-02-01 00:10:11 +000065class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000066 def test_chain(self):
67 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000068 self.assertEqual(list(chain('abc')), list('abc'))
69 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000070 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Christian Heimesf16baeb2008-02-29 14:57:44 +000071 self.assertRaises(TypeError, list,chain(2, 3))
72
73 def test_chain_from_iterable(self):
74 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
75 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
76 self.assertEqual(list(chain.from_iterable([''])), [])
77 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
78 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000079
Christian Heimes380f7f22008-02-28 11:19:05 +000080 def test_combinations(self):
81 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
82 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +000083 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +000084 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
85 self.assertRaises(ValueError, combinations, 'abc', 32) # r is too big
86 self.assertEqual(list(combinations(range(4), 3)),
87 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
Christian Heimes78644762008-03-04 23:39:23 +000088
89 def combinations1(iterable, r):
90 'Pure python version shown in the docs'
91 pool = tuple(iterable)
92 n = len(pool)
93 indices = list(range(r))
94 yield tuple(pool[i] for i in indices)
95 while 1:
96 for i in reversed(range(r)):
97 if indices[i] != i + n - r:
98 break
99 else:
100 return
101 indices[i] += 1
102 for j in range(i+1, r):
103 indices[j] = indices[j-1] + 1
104 yield tuple(pool[i] for i in indices)
105
106 def combinations2(iterable, r):
107 'Pure python version shown in the docs'
108 pool = tuple(iterable)
109 n = len(pool)
110 for indices in permutations(range(n), r):
111 if sorted(indices) == list(indices):
112 yield tuple(pool[i] for i in indices)
113
114 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000115 values = [5*x-12 for x in range(n)]
116 for r in range(n+1):
117 result = list(combinations(values, r))
118 self.assertEqual(len(result), fact(n) / fact(r) / fact(n-r)) # right number of combs
119 self.assertEqual(len(result), len(set(result))) # no repeats
120 self.assertEqual(result, sorted(result)) # lexicographic order
121 for c in result:
122 self.assertEqual(len(c), r) # r-length combinations
123 self.assertEqual(len(set(c)), r) # no duplicate elements
124 self.assertEqual(list(c), sorted(c)) # keep original ordering
125 self.assert_(all(e in values for e in c)) # elements taken from input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000126 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
127 self.assertEqual(result, list(combinations2(values, r))) # matches first pure python version
128
129 # Test implementation detail: tuple re-use
130 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
131 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
132
133 def test_permutations(self):
134 self.assertRaises(TypeError, permutations) # too few arguments
135 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
136## self.assertRaises(TypeError, permutations, None) # pool is not iterable
137## self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
138## self.assertRaises(ValueError, permutations, 'abc', 32) # r is too big
139 self.assertEqual(list(permutations(range(3), 2)),
140 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
141
142 def permutations1(iterable, r=None):
143 'Pure python version shown in the docs'
144 pool = tuple(iterable)
145 n = len(pool)
146 r = n if r is None else r
147 indices = list(range(n))
148 cycles = list(range(n-r+1, n+1))[::-1]
149 yield tuple(pool[i] for i in indices[:r])
150 while n:
151 for i in reversed(range(r)):
152 cycles[i] -= 1
153 if cycles[i] == 0:
154 indices[i:] = indices[i+1:] + indices[i:i+1]
155 cycles[i] = n - i
156 else:
157 j = cycles[i]
158 indices[i], indices[-j] = indices[-j], indices[i]
159 yield tuple(pool[i] for i in indices[:r])
160 break
161 else:
162 return
163
164 def permutations2(iterable, r=None):
165 'Pure python version shown in the docs'
166 pool = tuple(iterable)
167 n = len(pool)
168 r = n if r is None else r
169 for indices in product(range(n), repeat=r):
170 if len(set(indices)) == r:
171 yield tuple(pool[i] for i in indices)
172
173 for n in range(7):
174 values = [5*x-12 for x in range(n)]
175 for r in range(n+1):
176 result = list(permutations(values, r))
177 self.assertEqual(len(result), fact(n) / fact(n-r)) # right number of perms
178 self.assertEqual(len(result), len(set(result))) # no repeats
179 self.assertEqual(result, sorted(result)) # lexicographic order
180 for p in result:
181 self.assertEqual(len(p), r) # r-length permutations
182 self.assertEqual(len(set(p)), r) # no duplicate elements
183 self.assert_(all(e in values for e in p)) # elements taken from input iterable
184 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
185 self.assertEqual(result, list(permutations2(values, r))) # matches first pure python version
186 if r == n:
187 self.assertEqual(result, list(permutations(values, None))) # test r as None
188 self.assertEqual(result, list(permutations(values))) # test default r
189
190 # Test implementation detail: tuple re-use
191## self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
192 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000193
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000194 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000195 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
196 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
197 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000198 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
199 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000200 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000201 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000202 self.assertEqual(list(islice(count(maxsize-5), 10)),
203 list(range(maxsize-5, maxsize+5)))
204 self.assertEqual(list(islice(count(-maxsize-5), 10)),
205 list(range(-maxsize-5, -maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000206 c = count(3)
207 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000208 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000209 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000210 c = count(-9)
211 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000212 next(c)
213 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000214 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000215 # Test repr (ignoring the L in longs)
216 r1 = repr(count(i)).replace('L', '')
217 r2 = 'count(%r)'.__mod__(i).replace('L', '')
218 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000219
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000220 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000221 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000222 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000223 self.assertRaises(TypeError, cycle)
224 self.assertRaises(TypeError, cycle, 5)
225 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000226
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000227 def test_groupby(self):
228 # Check whether it accepts arguments correctly
229 self.assertEqual([], list(groupby([])))
230 self.assertEqual([], list(groupby([], key=id)))
231 self.assertRaises(TypeError, list, groupby('abc', []))
232 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000233 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000234
235 # Check normal input
236 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
237 (2,15,22), (3,16,23), (3,17,23)]
238 dup = []
239 for k, g in groupby(s, lambda r:r[0]):
240 for elem in g:
241 self.assertEqual(k, elem[0])
242 dup.append(elem)
243 self.assertEqual(s, dup)
244
245 # Check nested case
246 dup = []
247 for k, g in groupby(s, lambda r:r[0]):
248 for ik, ig in groupby(g, lambda r:r[2]):
249 for elem in ig:
250 self.assertEqual(k, elem[0])
251 self.assertEqual(ik, elem[2])
252 dup.append(elem)
253 self.assertEqual(s, dup)
254
255 # Check case where inner iterator is not used
256 keys = [k for k, g in groupby(s, lambda r:r[0])]
257 expectedkeys = set([r[0] for r in s])
258 self.assertEqual(set(keys), expectedkeys)
259 self.assertEqual(len(keys), len(expectedkeys))
260
261 # Exercise pipes and filters style
262 s = 'abracadabra'
263 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000264 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000265 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
266 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000267 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000268 self.assertEqual(r, ['a', 'b', 'r'])
269 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000270 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000271 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
272 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000273 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000274 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
275
Georg Brandla18af4e2007-04-21 15:47:16 +0000276 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000277 class ExpectedError(Exception):
278 pass
279 def delayed_raise(n=0):
280 for i in range(n):
281 yield 'yo'
282 raise ExpectedError
283 def gulp(iterable, keyp=None, func=list):
284 return [func(g) for k, g in groupby(iterable, keyp)]
285
Georg Brandla18af4e2007-04-21 15:47:16 +0000286 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000287 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000288 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000289 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
290
291 # __cmp__ failure
292 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000293 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000294 raise ExpectedError
295 s = [DummyCmp(), DummyCmp(), None]
296
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000297 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000298 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000299 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000300 self.assertRaises(ExpectedError, gulp, s)
301
302 # keyfunc failure
303 def keyfunc(obj):
304 if keyfunc.skip > 0:
305 keyfunc.skip -= 1
306 return obj
307 else:
308 raise ExpectedError
309
310 # keyfunc failure on outer object
311 keyfunc.skip = 0
312 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
313 keyfunc.skip = 1
314 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
315
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000316 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000317 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000318 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Christian Heimes836baa52008-02-26 08:18:30 +0000319 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000320 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000321 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000322 self.assertRaises(TypeError, ifilter, lambda x:x)
323 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000324 self.assertRaises(TypeError, ifilter, isEven, 3)
Georg Brandla18af4e2007-04-21 15:47:16 +0000325 self.assertRaises(TypeError, next, ifilter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000326
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000327 def test_filterfalse(self):
328 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
329 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
330 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
331 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
332 self.assertRaises(TypeError, filterfalse)
333 self.assertRaises(TypeError, filterfalse, lambda x:x)
334 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
335 self.assertRaises(TypeError, filterfalse, isEven, 3)
336 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000337
338 def test_izip(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000339 # XXX This is rather silly now that builtin zip() calls izip()...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000340 ans = [(x,y) for x, y in izip('abc',count())]
341 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Guido van Rossum801f0d72006-08-24 19:48:10 +0000342 self.assertEqual(list(izip('abc', range(6))), lzip('abc', range(6)))
343 self.assertEqual(list(izip('abcdef', range(3))), lzip('abcdef', range(3)))
344 self.assertEqual(take(3,izip('abcdef', count())), lzip('abcdef', range(3)))
345 self.assertEqual(list(izip('abcdef')), lzip('abcdef'))
346 self.assertEqual(list(izip()), lzip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000347 self.assertRaises(TypeError, izip, 3)
348 self.assertRaises(TypeError, izip, range(3), 3)
349 # Check tuple re-use (implementation detail)
350 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000351 lzip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000352 self.assertEqual([pair for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000353 lzip('abc', 'def'))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000354 ids = list(map(id, izip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000355 self.assertEqual(min(ids), max(ids))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000356 ids = list(map(id, list(izip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000357 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000358
Thomas Wouterscf297e42007-02-23 15:07:44 +0000359 def test_iziplongest(self):
360 for args in [
361 ['abc', range(6)],
362 [range(6), 'abc'],
363 [range(1000), range(2000,2100), range(3000,3050)],
364 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
365 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
366 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000367 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
368 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000369 self.assertEqual(list(zip_longest(*args)), target)
370 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000371 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000372 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000373
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000374 self.assertEqual(take(3,zip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
Thomas Wouterscf297e42007-02-23 15:07:44 +0000375
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000376 self.assertEqual(list(zip_longest()), list(zip()))
377 self.assertEqual(list(zip_longest([])), list(zip([])))
378 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000379
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000380 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000381 list(izip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000382 self.assertRaises(TypeError, zip_longest, 3)
383 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000384
385 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000386 "zip_longest('abc', fv=1)",
387 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000388 ]:
389 try:
390 eval(stmt, globals(), locals())
391 except TypeError:
392 pass
393 else:
394 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000395
Thomas Wouterscf297e42007-02-23 15:07:44 +0000396 # Check tuple re-use (implementation detail)
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000397 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000398 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000399 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000400 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000401 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000402 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000403 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000404 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
405
Christian Heimesc3f30c42008-02-22 16:37:40 +0000406 def test_product(self):
407 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000408 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000409 (['ab'], [('a',), ('b',)]), # one iterable
410 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
411 ([range(0), range(2), range(3)], []), # first iterable with zero length
412 ([range(2), range(0), range(3)], []), # middle iterable with zero length
413 ([range(2), range(3), range(0)], []), # last iterable with zero length
414 ]:
415 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000416 for r in range(4):
417 self.assertEqual(list(product(*(args*r))),
418 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000419 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
420 self.assertRaises(TypeError, product, range(6), None)
421 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
422 set('abcdefg'), range(11), tuple(range(13))]
423 for i in range(100):
424 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +0000425 expected_len = prod(map(len, args))
426 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000427 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +0000428 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000429
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000430 # Test implementation detail: tuple re-use
431 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
432 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000433
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000434 def test_repeat(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000435 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000436 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000437 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000438 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000439 self.assertEqual(list(repeat('a', 0)), [])
440 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000441 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000442 self.assertRaises(TypeError, repeat, None, 3, 4)
443 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000444 r = repeat(1+0j)
445 self.assertEqual(repr(r), 'repeat((1+0j))')
446 r = repeat(1+0j, 5)
447 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
448 list(r)
449 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000450
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000451 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000452 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
453 [0**1, 1**2, 2**3])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000454 def tupleize(*args):
455 return args
456 self.assertEqual(list(imap(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000457 [('a',0),('b',1),('c',2)])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000458 self.assertEqual(list(imap(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000459 [('a',0),('b',1),('c',2)])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000460 self.assertEqual(take(2,imap(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000461 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000462 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000463 self.assertRaises(TypeError, imap)
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000464 self.assertRaises(TypeError, list, imap(None, range(3), range(3)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000465 self.assertRaises(TypeError, imap, operator.neg)
Georg Brandla18af4e2007-04-21 15:47:16 +0000466 self.assertRaises(TypeError, next, imap(10, range(5)))
467 self.assertRaises(ValueError, next, imap(errfunc, [4], [5]))
468 self.assertRaises(TypeError, next, imap(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000469
470 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000471 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
472 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000473 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
474 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000475 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +0000476 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
477 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000478 self.assertRaises(TypeError, starmap)
479 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000480 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
481 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
482 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000483
484 def test_islice(self):
485 for args in [ # islice(args) should agree with range(args)
486 (10, 20, 3),
487 (10, 3, 20),
488 (10, 20),
489 (10, 3),
490 (20,)
491 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000492 self.assertEqual(list(islice(range(100), *args)),
493 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000494
495 for args, tgtargs in [ # Stop when seqn is exhausted
496 ((10, 110, 3), ((10, 100, 3))),
497 ((10, 110), ((10, 100))),
498 ((110,), (100,))
499 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000500 self.assertEqual(list(islice(range(100), *args)),
501 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000502
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000503 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000504 self.assertEqual(list(islice(range(10), None)), list(range(10)))
505 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
506 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
507 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
508 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000509
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000510 # Test number of items consumed SF #1171417
511 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000512 self.assertEqual(list(islice(it, 3)), list(range(3)))
513 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000514
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000515 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000516 self.assertRaises(TypeError, islice, range(10))
517 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
518 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
519 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
520 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
521 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
522 self.assertRaises(ValueError, islice, range(10), 'a')
523 self.assertRaises(ValueError, islice, range(10), 'a', 1)
524 self.assertRaises(ValueError, islice, range(10), 1, 'a')
525 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
526 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000527 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000528
529 def test_takewhile(self):
530 data = [1, 3, 5, 20, 2, 4, 6, 8]
531 underten = lambda x: x<10
532 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000533 self.assertEqual(list(takewhile(underten, [])), [])
534 self.assertRaises(TypeError, takewhile)
535 self.assertRaises(TypeError, takewhile, operator.pow)
536 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000537 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
538 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000539 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
540 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000541 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000542
543 def test_dropwhile(self):
544 data = [1, 3, 5, 20, 2, 4, 6, 8]
545 underten = lambda x: x<10
546 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000547 self.assertEqual(list(dropwhile(underten, [])), [])
548 self.assertRaises(TypeError, dropwhile)
549 self.assertRaises(TypeError, dropwhile, operator.pow)
550 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000551 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
552 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000553
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000554 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000555 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000556 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000557 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000558 yield i
559
560 a, b = tee([]) # test empty iterator
561 self.assertEqual(list(a), [])
562 self.assertEqual(list(b), [])
563
564 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000565 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000566
567 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000568 self.assertEqual(list(a), list(range(n)))
569 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000570
571 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000572 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000573 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000574 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000575 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000576
577 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000578 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000579 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000580 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000581 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000582
Guido van Rossum805365e2007-05-07 22:24:25 +0000583 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000584 order = [0]*n + [1]*n
585 random.shuffle(order)
586 lists = ([], [])
587 its = tee(irange(n))
588 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000589 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000590 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000591 self.assertEqual(lists[0], list(range(n)))
592 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000593
Raymond Hettingerad983e72003-11-12 14:32:26 +0000594 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000595 self.assertRaises(TypeError, tee)
596 self.assertRaises(TypeError, tee, 3)
597 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000598 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000599
Raymond Hettingerad983e72003-11-12 14:32:26 +0000600 # tee object should be instantiable
601 a, b = tee('abc')
602 c = type(a)('def')
603 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000604
Raymond Hettingerad983e72003-11-12 14:32:26 +0000605 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000606 a, b, c = tee(range(2000), 3)
607 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000608 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000609 self.assertEqual(list(b), list(range(2000)))
610 self.assertEqual([next(c), next(c)], list(range(2)))
611 self.assertEqual(list(a), list(range(100,2000)))
612 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000613
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000614 # test values of n
615 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000616 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000617 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000618 result = tee('abc', n)
619 self.assertEqual(type(result), tuple)
620 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000621 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000622
Raymond Hettingerad983e72003-11-12 14:32:26 +0000623 # tee pass-through to copyable iterator
624 a, b = tee('abc')
625 c, d = tee(a)
626 self.assert_(a is c)
627
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000628 # test tee_new
629 t1, t2 = tee('abc')
630 tnew = type(t1)
631 self.assertRaises(TypeError, tnew)
632 self.assertRaises(TypeError, tnew, 10)
633 t3 = tnew(t1)
634 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000635
Raymond Hettingera9f60922004-10-17 16:40:14 +0000636 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000637 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000638 p = proxy(a)
639 self.assertEqual(getattr(p, '__class__'), type(b))
640 del a
641 self.assertRaises(ReferenceError, getattr, p, '__class__')
642
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000643 def test_StopIteration(self):
Georg Brandla18af4e2007-04-21 15:47:16 +0000644 self.assertRaises(StopIteration, next, izip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000645
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000646 for f in (chain, cycle, izip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000647 self.assertRaises(StopIteration, next, f([]))
648 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000649
Georg Brandla18af4e2007-04-21 15:47:16 +0000650 self.assertRaises(StopIteration, next, islice([], None))
651 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000652
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000653 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000654 self.assertRaises(StopIteration, next, p)
655 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000656 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000657 self.assertRaises(StopIteration, next, p)
658 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000659
Georg Brandla18af4e2007-04-21 15:47:16 +0000660 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000661
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000662 for f in (ifilter, filterfalse, imap, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000663 self.assertRaises(StopIteration, next, f(lambda x:x, []))
664 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000665
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000666class TestGC(unittest.TestCase):
667
668 def makecycle(self, iterator, container):
669 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000670 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000671 del container, iterator
672
673 def test_chain(self):
674 a = []
675 self.makecycle(chain(a), a)
676
677 def test_cycle(self):
678 a = []
679 self.makecycle(cycle([a]*2), a)
680
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000681 def test_dropwhile(self):
682 a = []
683 self.makecycle(dropwhile(bool, [0, a, a]), a)
684
685 def test_groupby(self):
686 a = []
687 self.makecycle(groupby([a]*2, lambda x:x), a)
688
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000689 def test_ifilter(self):
690 a = []
691 self.makecycle(ifilter(lambda x:True, [a]*2), a)
692
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000693 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000694 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000695 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000696
697 def test_izip(self):
698 a = []
699 self.makecycle(izip([a]*2, [a]*3), a)
700
701 def test_imap(self):
702 a = []
703 self.makecycle(imap(lambda x:x, [a]*2), a)
704
705 def test_islice(self):
706 a = []
707 self.makecycle(islice([a]*2, None), a)
708
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000709 def test_repeat(self):
710 a = []
711 self.makecycle(repeat(a), a)
712
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000713 def test_starmap(self):
714 a = []
715 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
716
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000717 def test_takewhile(self):
718 a = []
719 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
720
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000721def R(seqn):
722 'Regular generator'
723 for i in seqn:
724 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000725
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000726class G:
727 'Sequence using __getitem__'
728 def __init__(self, seqn):
729 self.seqn = seqn
730 def __getitem__(self, i):
731 return self.seqn[i]
732
733class I:
734 'Sequence using iterator protocol'
735 def __init__(self, seqn):
736 self.seqn = seqn
737 self.i = 0
738 def __iter__(self):
739 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000740 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000741 if self.i >= len(self.seqn): raise StopIteration
742 v = self.seqn[self.i]
743 self.i += 1
744 return v
745
746class Ig:
747 'Sequence using iterator protocol defined with a generator'
748 def __init__(self, seqn):
749 self.seqn = seqn
750 self.i = 0
751 def __iter__(self):
752 for val in self.seqn:
753 yield val
754
755class X:
756 'Missing __getitem__ and __iter__'
757 def __init__(self, seqn):
758 self.seqn = seqn
759 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +0000760 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000761 if self.i >= len(self.seqn): raise StopIteration
762 v = self.seqn[self.i]
763 self.i += 1
764 return v
765
766class N:
Georg Brandla18af4e2007-04-21 15:47:16 +0000767 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000768 def __init__(self, seqn):
769 self.seqn = seqn
770 self.i = 0
771 def __iter__(self):
772 return self
773
774class E:
775 'Test propagation of exceptions'
776 def __init__(self, seqn):
777 self.seqn = seqn
778 self.i = 0
779 def __iter__(self):
780 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000781 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000782 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000783
784class S:
785 'Test immediate stop'
786 def __init__(self, seqn):
787 pass
788 def __iter__(self):
789 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000790 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000791 raise StopIteration
792
793def L(seqn):
794 'Test multiple tiers of iterators'
795 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
796
797
798class TestVariousIteratorArgs(unittest.TestCase):
799
800 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000801 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000802 for g in (G, I, Ig, S, L, R):
803 self.assertEqual(list(chain(g(s))), list(g(s)))
804 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +0000805 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +0000806 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000807 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
808
Christian Heimesc3f30c42008-02-22 16:37:40 +0000809 def test_product(self):
810 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
811 self.assertRaises(TypeError, product, X(s))
812 self.assertRaises(TypeError, product, N(s))
813 self.assertRaises(ZeroDivisionError, product, E(s))
814
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000815 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000816 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000817 for g in (G, I, Ig, S, L, R):
818 tgtlen = len(s) * 3
819 expected = list(g(s))*3
820 actual = list(islice(cycle(g(s)), tgtlen))
821 self.assertEqual(actual, expected)
822 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000823 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000824 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
825
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000826 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000827 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000828 for g in (G, I, Ig, S, L, R):
829 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
830 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000831 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000832 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
833
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000834 def test_ifilter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000835 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000836 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000837 self.assertEqual(list(ifilter(isEven, g(s))),
838 [x for x in g(s) if isEven(x)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000839 self.assertRaises(TypeError, ifilter, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000840 self.assertRaises(TypeError, ifilter, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000841 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
842
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000843 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000844 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000845 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000846 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000847 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000848 self.assertRaises(TypeError, filterfalse, isEven, X(s))
849 self.assertRaises(TypeError, filterfalse, isEven, N(s))
850 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000851
852 def test_izip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000853 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000854 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000855 self.assertEqual(list(izip(g(s))), lzip(g(s)))
856 self.assertEqual(list(izip(g(s), g(s))), lzip(g(s), g(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000857 self.assertRaises(TypeError, izip, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000858 self.assertRaises(TypeError, izip, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000859 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
860
Thomas Wouterscf297e42007-02-23 15:07:44 +0000861 def test_iziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000862 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000863 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000864 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
865 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
866 self.assertRaises(TypeError, zip_longest, X(s))
867 self.assertRaises(TypeError, zip_longest, N(s))
868 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000869
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000870 def test_imap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000871 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000872 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000873 self.assertEqual(list(imap(onearg, g(s))),
874 [onearg(x) for x in g(s)])
875 self.assertEqual(list(imap(operator.pow, g(s), g(s))),
876 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000877 self.assertRaises(TypeError, imap, onearg, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000878 self.assertRaises(TypeError, imap, onearg, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000879 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
880
881 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000882 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000883 for g in (G, I, Ig, S, L, R):
884 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
885 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000886 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000887 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
888
889 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000890 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000891 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000892 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000893 self.assertEqual(list(starmap(operator.pow, g(ss))),
894 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000895 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000896 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000897 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
898
899 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000900 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000901 for g in (G, I, Ig, S, L, R):
902 tgt = []
903 for elem in g(s):
904 if not isEven(elem): break
905 tgt.append(elem)
906 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
907 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000908 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000909 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
910
911 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000912 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000913 for g in (G, I, Ig, S, L, R):
914 tgt = []
915 for elem in g(s):
916 if not tgt and isOdd(elem): continue
917 tgt.append(elem)
918 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
919 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000920 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000921 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
922
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000923 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000924 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000925 for g in (G, I, Ig, S, L, R):
926 it1, it2 = tee(g(s))
927 self.assertEqual(list(it1), list(g(s)))
928 self.assertEqual(list(it2), list(g(s)))
929 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000930 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000931 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
932
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000933class LengthTransparency(unittest.TestCase):
934
935 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000936 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000937 self.assertEqual(len(repeat(None, 50)), 50)
938 self.assertRaises(TypeError, len, repeat(None))
939
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000940class RegressionTests(unittest.TestCase):
941
942 def test_sf_793826(self):
943 # Fix Armin Rigo's successful efforts to wreak havoc
944
945 def mutatingtuple(tuple1, f, tuple2):
946 # this builds a tuple t which is a copy of tuple1,
947 # then calls f(t), then mutates t to be equal to tuple2
948 # (needs len(tuple1) == len(tuple2)).
949 def g(value, first=[1]):
950 if first:
951 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +0000952 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000953 return value
954 items = list(tuple2)
955 items[1:1] = list(tuple1)
956 gen = imap(g, items)
957 z = izip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +0000958 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000959
960 def f(t):
961 global T
962 T = t
963 first[:] = list(T)
964
965 first = []
966 mutatingtuple((1,2,3), f, (4,5,6))
967 second = list(T)
968 self.assertEqual(first, second)
969
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000970
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000971 def test_sf_950057(self):
972 # Make sure that chain() and cycle() catch exceptions immediately
973 # rather than when shifting between input sources
974
975 def gen1():
976 hist.append(0)
977 yield 1
978 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000979 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000980 hist.append(2)
981
982 def gen2(x):
983 hist.append(3)
984 yield 2
985 hist.append(4)
986 if x:
987 raise StopIteration
988
989 hist = []
990 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
991 self.assertEqual(hist, [0,1])
992
993 hist = []
994 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
995 self.assertEqual(hist, [0,1])
996
997 hist = []
998 self.assertRaises(AssertionError, list, cycle(gen1()))
999 self.assertEqual(hist, [0,1])
1000
Thomas Woutersb2137042007-02-01 18:02:27 +00001001class SubclassWithKwargsTest(unittest.TestCase):
1002 def test_keywords_in_subclass(self):
1003 # count is not subclassable...
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001004 for cls in (repeat, izip, ifilter, filterfalse, chain, imap,
Thomas Woutersb2137042007-02-01 18:02:27 +00001005 starmap, islice, takewhile, dropwhile, cycle):
1006 class Subclass(cls):
1007 def __init__(self, newarg=None, *args):
1008 cls.__init__(self, *args)
1009 try:
1010 Subclass(newarg=1)
1011 except TypeError as err:
1012 # we expect type errors because of wrong argument count
1013 self.failIf("does not take keyword arguments" in err.args[0])
1014
1015
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001016libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001017
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001018
1019>>> amounts = [120.15, 764.05, 823.14]
1020>>> for checknum, amount in izip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00001021... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001022...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001023Check 1200 is for $120.15
1024Check 1201 is for $764.05
1025Check 1202 is for $823.14
1026
1027>>> import operator
Guido van Rossum805365e2007-05-07 22:24:25 +00001028>>> for cube in imap(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00001029... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001030...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000010311
10328
103327
1034
1035>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001036>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00001037... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00001038...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001039Alex
1040Laura
1041Martin
1042Walter
1043Samuele
1044
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001045>>> from operator import itemgetter
1046>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001047>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001048>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001049... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001050...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000010511 ['a', 'c', 'e']
10522 ['b', 'd', 'f']
10533 ['g']
1054
Raymond Hettinger734fb572004-01-20 20:04:40 +00001055# Find runs of consecutive numbers using groupby. The key to the solution
1056# is differencing with a range so that consecutive numbers all appear in
1057# same group.
1058>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001059>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001060... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001061...
Raymond Hettinger734fb572004-01-20 20:04:40 +00001062[1]
1063[4, 5, 6]
1064[10]
1065[15, 16, 17, 18]
1066[22]
1067[25, 26, 27, 28]
1068
Raymond Hettingera098b332003-09-08 23:58:40 +00001069>>> def take(n, seq):
1070... return list(islice(seq, n))
1071
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001072>>> def enumerate(iterable):
1073... return izip(count(), iterable)
1074
1075>>> def tabulate(function):
1076... "Return function(0), function(1), ..."
1077... return imap(function, count())
1078
1079>>> def iteritems(mapping):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001080... return izip(mapping.keys(), mapping.values())
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001081
1082>>> def nth(iterable, n):
1083... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +00001084... return list(islice(iterable, n, n+1))
1085
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001086>>> def all(seq, pred=None):
1087... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001088... for elem in filterfalse(pred, seq):
Raymond Hettinger4533f1f2004-09-23 07:27:39 +00001089... return False
1090... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +00001091
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001092>>> def any(seq, pred=None):
1093... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +00001094... for elem in ifilter(pred, seq):
1095... return True
1096... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +00001097
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001098>>> def no(seq, pred=None):
1099... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +00001100... for elem in ifilter(pred, seq):
1101... return False
1102... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +00001103
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001104>>> def quantify(seq, pred=None):
1105... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +00001106... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001107
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001108>>> def padnone(seq):
1109... "Returns the sequence elements and then returns None indefinitely"
1110... return chain(seq, repeat(None))
1111
1112>>> def ncycles(seq, n):
1113... "Returns the sequence elements n times"
1114... return chain(*repeat(seq, n))
1115
1116>>> def dotproduct(vec1, vec2):
1117... return sum(imap(operator.mul, vec1, vec2))
1118
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001119>>> def flatten(listOfLists):
1120... return list(chain(*listOfLists))
1121
1122>>> def repeatfunc(func, times=None, *args):
1123... "Repeat calls to func with specified arguments."
1124... " Example: repeatfunc(random.random)"
1125... if times is None:
1126... return starmap(func, repeat(args))
1127... else:
1128... return starmap(func, repeat(args, times))
1129
Raymond Hettingerd591f662003-10-26 15:34:50 +00001130>>> def pairwise(iterable):
1131... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1132... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001133... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001134... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001135... except StopIteration:
1136... pass
1137... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001138
1139This is not part of the examples but it tests to make sure the definitions
1140perform as purported.
1141
Raymond Hettingera098b332003-09-08 23:58:40 +00001142>>> take(10, count())
1143[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1144
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001145>>> list(enumerate('abc'))
1146[(0, 'a'), (1, 'b'), (2, 'c')]
1147
1148>>> list(islice(tabulate(lambda x: 2*x), 4))
1149[0, 2, 4, 6]
1150
1151>>> nth('abcde', 3)
1152['d']
1153
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001154>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001155True
1156
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001157>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001158False
1159
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001160>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001161True
1162
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001163>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001164False
1165
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001166>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001167True
1168
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001169>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001170False
1171
Guido van Rossum805365e2007-05-07 22:24:25 +00001172>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000117350
1174
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001175>>> a = [[1, 2, 3], [4, 5, 6]]
1176>>> flatten(a)
1177[1, 2, 3, 4, 5, 6]
1178
1179>>> list(repeatfunc(pow, 5, 2, 3))
1180[8, 8, 8, 8, 8]
1181
1182>>> import random
1183>>> take(5, imap(int, repeatfunc(random.random)))
1184[0, 0, 0, 0, 0]
1185
Raymond Hettingerd591f662003-10-26 15:34:50 +00001186>>> list(pairwise('abcd'))
1187[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001188
Raymond Hettingerd591f662003-10-26 15:34:50 +00001189>>> list(pairwise([]))
1190[]
1191
1192>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001193[]
1194
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001195>>> list(islice(padnone('abc'), 0, 6))
1196['a', 'b', 'c', None, None, None]
1197
1198>>> list(ncycles('abc', 3))
1199['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1200
1201>>> dotproduct([1,2,3], [4,5,6])
120232
1203
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001204"""
1205
1206__test__ = {'libreftest' : libreftest}
1207
1208def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001209 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001210 RegressionTests, LengthTransparency,
1211 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001212 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001213
1214 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001215 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001216 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001217 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001218 for i in range(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001219 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001220 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001221 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001222 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001223
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001224 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001225 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001226
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001227if __name__ == "__main__":
1228 test_main(verbose=True)