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