#!/usr/bin/env python3
'''
Класс «vector» на скорую руку

    сложение векторов и с числом
        выяснить тип операнда 
    умножение на вектор и на число

        в т. ч. __rmul__ 

    Не забыть делать именно вектор, type(self)(...)
'''

class vector:
    '''Класс «вектор», поддерживающий
    - индексацию (⇒ итерирование)
    - поэлементное сложение и умножение с последовательностью
    - сложение и умножение с числом'''
    def __init__(self, seq=[]):
        '''seq — произвольная последовательность'''
        self.seq = list(seq)

    def __len__(self):
        return len(self.seq)

    def __getitem__(self, n):
        return self.seq[n]

    def __op(self, other, fun):
        '''Вычисление функции fun
        - над всеми элементами self и other попарно, если other итерируемо;
        - или же над всеми элементами self и значением other'''
        if hasattr(other,"__getitem__"):
            # type(self)(последовательность) конструирует экземпляр текущего класса
            return type(self)(fun(a,b) for a,b in zip(self, other))
        else:
            return type(self)(fun(a,other) for a in self)

    def __add__(self, other):
        return self.__op(other, type(self.seq[0]).__add__)

    def __radd__(self, other):
        return self.__add__(other)

    def __mul__(self, other):
        return self.__op(other, type(self.seq[0]).__mul__)

    def __rmul__(self, other):
        return self.__mul__(other)

    def __str__(self):
        return "<"+",".join(str(s) for s in self)+">"

a = vector((1,2,3,4,5,6))

print(a,"+",1,"=",a+1)
print(1,"+",a,"=",1+a)
print(a,"+",a,"=",a+a)
l = 3,2,3,2,3,2
print(a,"+",l,"=",a+l)

print(a,"*",2,"=",a*2)
print(2,"*",a,"=",2*a)
print(a,"*",a,"=",a*a)
l = 3,2,3,2,3,2
print(a,"*",l,"=",a*l)
