如何修复n维向量类vect传入列表参数时的运算错误?
修复n维向量类的参数兼容问题
问题根源
原vect类的构造函数和plus/minus方法依赖可变参数*a实现多数字输入,但当传入列表/元组时,参数会被包裹成单元素元组(例如vect([1,2,3])会让self.a = ([1,2,3],))。此时调用plus([3,2,1]),zip(self.a, plus)会直接拼接两个列表,导致错误的[[1,2,3,3,2,1]]结果。
修复方案
利用提供的convert函数,在构造函数和运算方法中增加参数判断,自动将单个可迭代对象(列表/元组)展开为数字元组,同时保留多数字参数的兼容能力:
def convert(lst): return (*lst, ) class vect: def __init__(self, *a): # 处理单个可迭代对象输入(排除字符串/字节串) if len(a) == 1 and hasattr(a[0], '__iter__') and not isinstance(a[0], (str, bytes)): self.a = convert(a[0]) else: self.a = a def plus(self, *plus): # 统一处理plus参数格式 if len(plus) == 1 and hasattr(plus[0], '__iter__') and not isinstance(plus[0], (str, bytes)): plus = convert(plus[0]) res_plus = [vi + wi for vi, wi in zip(self.a, plus)] return res_plus def minus(self, *minus): # 统一处理minus参数格式 if len(minus) == 1 and hasattr(minus[0], '__iter__') and not isinstance(minus[0], (str, bytes)): minus = convert(minus[0]) res_minus = [vi - wi for vi, wi in zip(self.a, minus)] return res_minus def multiply(self, mult): res_multiply = [mult * vi for vi in self.a] return res_multiply
验证测试
测试1:多数字参数输入
x = vect(1,2,3) print('plus:', x.plus(3,2,1)) # 输出:plus: [4, 4, 4]
测试2:列表参数输入
x = vect([1,2,3]) print('plus:', x.plus([3,2,1])) # 输出:plus: [4, 4, 4]
核心逻辑
通过判断输入是否为单个可迭代对象(非字符串/字节串),调用convert将其展开为元组,确保self.a和运算参数始终是数字组成的元组,从而让向量加法、减法逻辑能正确遍历每个元素计算。
内容的提问来源于stack exchange,提问作者Stephen Brown
相关产品推荐
相关产品推荐

