Python 分割向量时出错
我已经创建了一个类向量,但它不能正确分割。当我要分割向量/0时,它不会抛出错误:Python 分割向量时出错,python,python-3.x,Python,Python 3.x,我已经创建了一个类向量,但它不能正确分割。当我要分割向量/0时,它不会抛出错误: class Vector(tuple): '''"Class to calculate the usual operations with vectors in bi and tridimensional coordinates. Too with n-dimmensinal.''' # __slots__=('V') #It's not possible because V is a v
class Vector(tuple):
'''"Class to calculate the usual operations with vectors in bi and
tridimensional coordinates. Too with n-dimmensinal.'''
# __slots__=('V') #It's not possible because V is a variable list of param.
def __new__(cls, *V):
'''The new method, we initialize the coordinates of a vector.
You can initialize a vector for example: V = Vector() or
V = Vector(a,b) or V = Vector(v1, v2, ..., vn)'''
if not V:
V = (0, 0)
elif len(V) == 1:
raise ValueError('A vector must have at least 2 coordinates.')
return tuple.__new__(cls, V)
def __mul__(self, V):
'''The operator mult overloaded. You can multipy 2 vectors coordinate
by coordinate.'''
if type(V) == type(self):
if len(self) != len(V):
raise IndexError('Vectors must have same dimmensions')
else:
multiplied = tuple(a * b for a, b in zip(self, V))
elif isinstance(V, type(1)) or isinstance(V, type(1.0)):
multiplied = tuple(a * V for a in self)
return Vector(*multiplied)
__rmul__ = __mul__
def make_one(self, long):
one = tuple(1 for a in range(0, long))
return Vector(*one)
def __truediv__(self, V):
if type(V) == type(self):
if len(self) != len(V):
raise IndexError('Vectors must have same dimmensions.')
if 0 in V:
raise ZeroDivisionError('Division by 0.')
divided = tuple(a / b for a, b in zip(self, V))
return Vector(*divided)
elif isinstance(V, int) or isinstance(V, float):
if V == 0:
return self * V * Vector().make_one(len(self))
#raise ZeroDivisionError('Division by 0.')
return self * (1 / V) * Vector().make_one(len(self))
__rtruediv__ = __truediv__
测试代码:
from Vector import Vector
def main():
V1 = Vector(3, 2, -1, 5)
print(0 / V1)
print(V1 / 0)
if __name__ == '__main__':
main()
控制台输出
(0,0,0,0)
(0,0,0,0)
第一个输出是正确的,但第二个输出是错误的,正确的方法是0除错。好的,多亏了@user2357112,正确的代码如下:
def __truediv__(self, V):
if type(V) == type(self):
if len(self) != len(V):
raise IndexError('Vectors must have same dimmensions.')
if 0 in V:
raise ZeroDivisionError('Division by 0.')
divided = tuple(a / b for a, b in zip(self, V))
return Vector(*divided)
elif isinstance(V, int) or isinstance(V, float):
if V == 0:
raise ZeroDivisionError('Division by 0.')
return self * (1 / V) * Vector().make_one(len(self))
#__rtruediv__ = __truediv__
def __rtruediv__(self, V):
if isinstance(V, int) or isinstance(V, float):
if V == 0:
return self * V * Vector().make_one(len(self))
return self * (1 / V) * Vector().make_one(len(self))
…您已经注释掉了错误raise
\uuuuurmul\uuuu=\ uuuuuuMul\uuuuu
和\uuuuuruediv\uuuruediv=\uruediv\uuuuuu
是\uuuuuurmul\uuuuu
和的正确实现。这个bug和jonrsharpe提到的bug的交互作用会导致0/V
看起来是正确的,而实际上代码是双重错误的。元组在Python中是不可变的类型,所以请确保记录向量的行为不同。我也可以推荐使用,因为你将来可能想做更复杂的计算。我不知道用Vector()乘以有什么意义。在你的代码中使用make_one(len(self))
。如果你完全跳过它,你不会得到同样的结果吗?此外,如果操作符尚未处理所有可能的输入类型,最好将else:return NotImplemented
放在操作符末尾(否则您可能意外地得到None
)。