annotate Demo/classes/Range.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents b70f08907546
children 558689b6d7f0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
945
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # Example of a generator: re-implement the built-in range function
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 # without actually constructing the list of values. (It turns out
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # that the built-in function is about 20 times faster -- that's why
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # it's built-in. :-)
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # Wrapper function to emulate the complicated range() arguments
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 def range(*a):
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 if len(a) == 1:
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 start, stop, step = 0, a[0], 1
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 elif len(a) == 2:
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 start, stop = a
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 step = 1
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 elif len(a) == 3:
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 start, stop, step = a
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 else:
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 raise TypeError, 'range() needs 1-3 arguments'
1427
8701b93383ab *** empty log message ***
Guido van Rossum <guido@python.org>
parents: 945
diff changeset
19 return Range(start, stop, step)
945
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # Class implementing a range object.
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 # To the user the instances feel like immutable sequences
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 # (and you can't concatenate or slice them)
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 class Range:
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 # initialization -- should be called only by range() above
1427
8701b93383ab *** empty log message ***
Guido van Rossum <guido@python.org>
parents: 945
diff changeset
29 def __init__(self, start, stop, step):
945
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 if step == 0:
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 raise ValueError, 'range() called with zero step'
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 self.start = start
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 self.stop = stop
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 self.step = step
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 self.len = max(0, int((self.stop - self.start) / self.step))
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 # implement `x` and is also used by print x
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 def __repr__(self):
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 return 'range' + `self.start, self.stop, self.step`
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 # implement len(x)
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 def __len__(self):
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 return self.len
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 # implement x[i]
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 def __getitem__(self, i):
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 if 0 <= i < self.len:
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 return self.start + self.step * i
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 else:
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 raise IndexError, 'range[i] index out of range'
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 # Small test program
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 def test():
1532
15e1b86104a6 builtin -> __builtin__
Guido van Rossum <guido@python.org>
parents: 1427
diff changeset
56 import time, __builtin__
945
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 print range(10), range(-10, 10), range(0, 10, 2)
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 for i in range(100, -100, -10): print i,
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 print
1553
b70f08907546 Use time.time() instead of time.millitimer()
Guido van Rossum <guido@python.org>
parents: 1532
diff changeset
60 t1 = time.time()
945
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 for i in range(1000):
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 pass
1553
b70f08907546 Use time.time() instead of time.millitimer()
Guido van Rossum <guido@python.org>
parents: 1532
diff changeset
63 t2 = time.time()
1532
15e1b86104a6 builtin -> __builtin__
Guido van Rossum <guido@python.org>
parents: 1427
diff changeset
64 for i in __builtin__.range(1000):
945
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 pass
1553
b70f08907546 Use time.time() instead of time.millitimer()
Guido van Rossum <guido@python.org>
parents: 1532
diff changeset
66 t3 = time.time()
b70f08907546 Use time.time() instead of time.millitimer()
Guido van Rossum <guido@python.org>
parents: 1532
diff changeset
67 print t2-t1, 'sec (class)'
b70f08907546 Use time.time() instead of time.millitimer()
Guido van Rossum <guido@python.org>
parents: 1532
diff changeset
68 print t3-t2, 'sec (built-in)'
945
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70
465b9841770e Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 test()