如何为自定义Vector类实现向量加法功能?
向量加法的正确实现方式
问题背景
需要实现向量a与向量b的加法,现有自定义Vector类代码如下:
class Vector: """ creates a vector, which can be indexed, changed and added to another vector. """ def __init__(self,n=0,vec=[]): """ creating vecor """ self.n=n self.vec=list(vec) if len(vec)==0: for i in range(n): self.vec.append(0) def __getitem__(self,i): """ indexing """ if i>=len(self.vec): return(None) else: return(self.vec[i]) def __setitem__(self,i,val): """ changing """ self.vec[i]=val
尝试添加的add方法如下:
def add(a,b): """ adds vector b to a """ x=0 for i in b: a[x]=a[x]+i x+=1 return (a)
期望支持用法:
a = Vector(vec = [1, 2, 3]) b = Vector(vec = [3, 4, 5]) c = Vector.add(a, b)
问题分析
现有add方法存在几个问题:
- 未作为类的方法纳入Vector类,无法通过
Vector.add(a,b)调用 - 直接修改原向量
a,不符合向量加法返回新向量的数学逻辑(原向量应保持不变) - Vector类未实现迭代器方法,直接
for i in b会触发报错 - 未处理两个向量长度不一致的情况
正确实现方案
步骤1:修复原Vector类的初始化隐患
原__init__方法中vec=[]的默认参数是可变对象,会导致多次实例化共享同一个列表,先修正这个问题:
def __init__(self, n=0, vec=None): """ creating vector """ self.n = n if vec is None: self.vec = [0]*n else: self.vec = list(vec) # 如果传入了vec,更新n为向量实际长度 self.n = len(self.vec)
步骤2:实现正确的add静态方法
将add方法作为静态方法添加到Vector类中,创建新向量存储结果,同时处理向量长度:
@staticmethod def add(a, b): """ adds vector b to vector a, returns a new Vector instance """ # 取两个向量的最小长度作为结果向量的长度 min_len = min(len(a.vec), len(b.vec)) result_vec = [] for i in range(min_len): result_vec.append(a[i] + b[i]) # 返回新的Vector实例 return Vector(vec=result_vec)
步骤3:可选:添加迭代器方法(方便遍历)
如果需要支持直接遍历向量元素,可以给Vector类添加__iter__方法:
def __iter__(self): return iter(self.vec)
完整代码
class Vector: """ creates a vector, which can be indexed, changed and added to another vector. """ def __init__(self, n=0, vec=None): """ creating vector """ self.n = n if vec is None: self.vec = [0]*n else: self.vec = list(vec) self.n = len(self.vec) def __getitem__(self, i): """ indexing """ if i >= len(self.vec): return None else: return self.vec[i] def __setitem__(self, i, val): """ changing """ if i < len(self.vec): # 增加边界检查,避免索引越界 self.vec[i] = val def __iter__(self): """ make vector iterable """ return iter(self.vec) @staticmethod def add(a, b): """ adds vector b to vector a, returns a new Vector instance """ min_len = min(len(a.vec), len(b.vec)) result_vec = [a[i] + b[i] for i in range(min_len)] return Vector(vec=result_vec) # 测试用法 a = Vector(vec=[1, 2, 3]) b = Vector(vec=[3, 4, 5]) c = Vector.add(a, b) # 输出结果向量的元素 print([item for item in c]) # 输出: [4, 6, 8]
额外优化:支持a + b语法(可选)
如果还想支持Python的加法运算符,可以实现__add__魔法方法:
def __add__(self, other): return Vector.add(self, other)
这样就可以直接用c = a + b来实现向量加法。
内容的提问来源于stack exchange,提问作者user20458448
相关产品推荐
相关产品推荐

