14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Vec: 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ A simple vector class 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Instances of the Vec class can be constructed from numbers 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm >>> a = Vec(1, 2, 3) 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm >>> b = Vec(3, 2, 1) 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm added 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm >>> a + b 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Vec(4, 4, 4) 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm subtracted 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm >>> a - b 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Vec(-2, 0, 2) 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and multiplied by a scalar on the left 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm >>> 3.0 * a 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Vec(3.0, 6.0, 9.0) 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm or on the right 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm >>> a * 3.0 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Vec(3.0, 6.0, 9.0) 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, *v): 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.v = list(v) 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @classmethod 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def fromlist(cls, v): 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not isinstance(v, list): 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise TypeError 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm inst = cls() 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm inst.v = v 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return inst 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __repr__(self): 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args = ', '.join(repr(x) for x in self.v) 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 'Vec({0})'.format(args) 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __len__(self): 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return len(self.v) 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getitem__(self, i): 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.v[i] 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __add__(self, other): 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Element-wise addition 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = [x + y for x, y in zip(self.v, other.v)] 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Vec.fromlist(v) 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __sub__(self, other): 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Element-wise subtraction 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = [x - y for x, y in zip(self.v, other.v)] 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Vec.fromlist(v) 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __mul__(self, scalar): 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Multiply by scalar 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = [x * scalar for x in self.v] 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Vec.fromlist(v) 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __rmul__ = __mul__ 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test(): 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import doctest 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm doctest.testmod() 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest() 69