blob: 18f626f45816de1553e05e9338ad80b07b874ea6 [file] [log] [blame]
Guido van Rossume8769491992-08-13 12:14:11 +00001# Example of a generator: re-implement the built-in range function
2# without actually constructing the list of values. (It turns out
3# that the built-in function is about 20 times faster -- that's why
4# it's built-in. :-)
5
6
7# Wrapper function to emulate the complicated range() arguments
8
9def range(*a):
10 if len(a) == 1:
11 start, stop, step = 0, a[0], 1
12 elif len(a) == 2:
13 start, stop = a
14 step = 1
15 elif len(a) == 3:
16 start, stop, step = a
17 else:
18 raise TypeError, 'range() needs 1-3 arguments'
Guido van Rossum7565b931993-12-17 14:23:52 +000019 return Range(start, stop, step)
Guido van Rossume8769491992-08-13 12:14:11 +000020
21
22# Class implementing a range object.
23# To the user the instances feel like immutable sequences
24# (and you can't concatenate or slice them)
25
26class Range:
27
28 # initialization -- should be called only by range() above
Guido van Rossum7565b931993-12-17 14:23:52 +000029 def __init__(self, start, stop, step):
Guido van Rossume8769491992-08-13 12:14:11 +000030 if step == 0:
31 raise ValueError, 'range() called with zero step'
32 self.start = start
33 self.stop = stop
34 self.step = step
35 self.len = max(0, int((self.stop - self.start) / self.step))
Guido van Rossume8769491992-08-13 12:14:11 +000036
37 # implement `x` and is also used by print x
38 def __repr__(self):
39 return 'range' + `self.start, self.stop, self.step`
40
41 # implement len(x)
42 def __len__(self):
43 return self.len
44
45 # implement x[i]
46 def __getitem__(self, i):
47 if 0 <= i < self.len:
48 return self.start + self.step * i
49 else:
50 raise IndexError, 'range[i] index out of range'
51
52
53# Small test program
54
55def test():
Guido van Rossum62326f21994-01-26 16:04:38 +000056 import time, __builtin__
Guido van Rossume8769491992-08-13 12:14:11 +000057 print range(10), range(-10, 10), range(0, 10, 2)
58 for i in range(100, -100, -10): print i,
59 print
Guido van Rossume69d3fe1994-02-17 12:36:58 +000060 t1 = time.time()
Guido van Rossume8769491992-08-13 12:14:11 +000061 for i in range(1000):
62 pass
Guido van Rossume69d3fe1994-02-17 12:36:58 +000063 t2 = time.time()
Guido van Rossum62326f21994-01-26 16:04:38 +000064 for i in __builtin__.range(1000):
Guido van Rossume8769491992-08-13 12:14:11 +000065 pass
Guido van Rossume69d3fe1994-02-17 12:36:58 +000066 t3 = time.time()
67 print t2-t1, 'sec (class)'
68 print t3-t2, 'sec (built-in)'
Guido van Rossume8769491992-08-13 12:14:11 +000069
70
71test()