| 
									
										
										
										
											2010-07-05 21:44:05 +00:00
										 |  |  | class Vec: | 
					
						
							|  |  |  |     """ A simple vector class
 | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-05 21:44:05 +00:00
										 |  |  |     Instances of the Vec class  can be constructed from numbers | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-05 21:44:05 +00:00
										 |  |  |     >>> a = Vec(1, 2, 3) | 
					
						
							|  |  |  |     >>> b = Vec(3, 2, 1) | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-05 21:44:05 +00:00
										 |  |  |     added | 
					
						
							|  |  |  |     >>> a + b | 
					
						
							|  |  |  |     Vec(4, 4, 4) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     subtracted | 
					
						
							|  |  |  |     >>> a - b | 
					
						
							|  |  |  |     Vec(-2, 0, 2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     and multiplied by a scalar on the left | 
					
						
							|  |  |  |     >>> 3.0 * a | 
					
						
							|  |  |  |     Vec(3.0, 6.0, 9.0) | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-05 21:44:05 +00:00
										 |  |  |     or on the right | 
					
						
							|  |  |  |     >>> a * 3.0 | 
					
						
							|  |  |  |     Vec(3.0, 6.0, 9.0) | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |     def __init__(self, *v): | 
					
						
							| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  |         self.v = list(v) | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-05 20:13:41 +00:00
										 |  |  |     @classmethod | 
					
						
							|  |  |  |     def fromlist(cls, v): | 
					
						
							| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  |         if not isinstance(v, list): | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |             raise TypeError | 
					
						
							| 
									
										
										
										
											2010-07-05 20:13:41 +00:00
										 |  |  |         inst = cls() | 
					
						
							|  |  |  |         inst.v = v | 
					
						
							|  |  |  |         return inst | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |     def __repr__(self): | 
					
						
							| 
									
										
										
										
											2010-07-05 21:44:05 +00:00
										 |  |  |         args = ', '.join(repr(x) for x in self.v) | 
					
						
							|  |  |  |         return 'Vec({})'.format(args) | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |     def __len__(self): | 
					
						
							|  |  |  |         return len(self.v) | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |     def __getitem__(self, i): | 
					
						
							|  |  |  |         return self.v[i] | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  |     def __add__(self, other): | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |         # Element-wise addition | 
					
						
							| 
									
										
										
										
											2010-07-05 21:44:05 +00:00
										 |  |  |         v = [x + y for x, y in zip(self.v, other.v)] | 
					
						
							| 
									
										
										
										
											2010-07-05 20:13:41 +00:00
										 |  |  |         return Vec.fromlist(v) | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-10 21:12:59 +00:00
										 |  |  |     def __sub__(self, other): | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |         # Element-wise subtraction | 
					
						
							| 
									
										
										
										
											2010-07-05 21:44:05 +00:00
										 |  |  |         v = [x - y for x, y in zip(self.v, other.v)] | 
					
						
							| 
									
										
										
										
											2010-07-05 20:13:41 +00:00
										 |  |  |         return Vec.fromlist(v) | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-24 17:13:18 +00:00
										 |  |  |     def __mul__(self, scalar): | 
					
						
							|  |  |  |         # Multiply by scalar | 
					
						
							| 
									
										
										
										
											2010-07-05 21:44:05 +00:00
										 |  |  |         v = [x * scalar for x in self.v] | 
					
						
							| 
									
										
										
										
											2010-07-05 20:13:41 +00:00
										 |  |  |         return Vec.fromlist(v) | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-05 21:44:05 +00:00
										 |  |  |     __rmul__ = __mul__ | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test(): | 
					
						
							| 
									
										
										
										
											2010-07-05 21:44:05 +00:00
										 |  |  |     import doctest | 
					
						
							|  |  |  |     doctest.testmod() | 
					
						
							| 
									
										
										
										
											1992-08-13 12:14:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | test() |