代码实现:
1. 在Vector.py编写代码
1 #向量类 2 #__values() 与 _values()区别更多体现在继承上,如果是在类的内部使用时官方建议使用_values()发方法 3 4 5 class Vector: 6 7 def __init__(self,lst): 8 self._values = list(lst)#将数组赋值给向量类中(注:使用list方法将列表lst复制一份保证他的不被外界调用时修改) 9 10 #零向量类方法:参数1:为当前的类(cls) 参数2:维度(dim) 返回dim维的零向量 11 @classmethod 12 def zero(cls,dim): 13 return cls([0] * dim) 14 15 #向量加法,返回结果向量 16 def __add__(self, another): 17 # assert判断传入的向量维度是否相等 18 assert len(self) == len(another), 19 "Error in adding. Length of vectors must be same." 20 return Vector([a+b for a,b in zip(self,another)])#使用zip()方法将两个向量取出来 21 22 # 向量减法 23 def __sub__(self, another): 24 assert len(self) == len(another), 25 "Error in adding. Length of vectors must be same." 26 return Vector([a - b for a, b in zip(self, another)]) 27 28 # 向量乘法(数乘数组),返回数量乘法的结果向量:self * k 29 def __mul__(self, k): 30 return Vector([k * e for e in self]) 31 32 # 向量乘法(数组乘数),返回数量乘法的结果向量:k * self 33 def __rmul__(k, self): 34 return k * self #此处直接调用的是上方的乘法函数 35 36 #返回向量取正的结果向量 37 def __pos__(self): 38 return 1 * self 39 40 # 返回向量取负的结果向量 41 def __neg__(self): 42 return -1 * self 43 44 #返回向量迭代器(当有迭代器时,zip()方法中就不用再次传入两个向量数组,直接传入向量对象即可<zip(self._values,another._values)>) 45 def __iter__(self): 46 return self._values.__iter__() 47 48 #取向量的index个元素 49 def __getitem__(self, index): 50 return self._values[index] 51 52 #返回向量的长度(有多少个元素) 53 def __len__(self): 54 return len(self._values) 55 56 # 向量展示(系统调用) 57 def __repr__(self): 58 return "Vector({})".format(self._values) 59 60 # 向量展示(用户调用) 61 def __str__(self): 62 return "({})".format(", ".join(str(e) for e in self._values))#通过遍历 self.__values 将e转成字符串通过逗号加空格来链接放入大括号中 63 64 # u = Vector([5,2]) 65 # print(u)
2.在main_vector.py展示中编写:
1 from playLA.Vector import Vector 2 3 if __name__ == "__main__": 4 5 vec = Vector([5,2]) 6 print(vec) 7 print(len(vec))#打印向量的维度 8 print("vec[0] = {}, vec[1] = {}".format(vec[0],vec[1])) 9 10 #向量加法 11 vec2 = Vector([3,1]) 12 print("{} + {} = {}".format(vec,vec2,vec+vec2)) 13 #向量减法 14 print("{} - {} = {}".format(vec, vec2, vec - vec2)) 15 #向量乘法(向量乘以数) 16 print("{} * {} = {}".format(vec,3,vec * 3)) 17 # 向量乘法(数乘以向量) 18 print("{} * {} = {}".format(3, vec, 3 * vec)) 19 # 向量取正 20 print("+{} = {}".format(vec, +vec)) 21 # 向量取负 22 print("-{} = {}".format(vec, -vec)) 23 24 #零向量 25 zero2 = Vector.zero(2) 26 print(zero2) 27 #向量加上零向量 28 print("{} + {} = {}".format(vec, zero2, vec + zero2))
3.运行main_vector.py结果为:
1 /Users/liuxiaoming/PycharmProjects/LinearAlgebra/venv/bin/python /Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevconsole.py --mode=client --port=57184 2 import sys; print('Python %s on %s' % (sys.version, sys.platform)) 3 sys.path.extend(['/Users/liuxiaoming/PycharmProjects/LinearAlgebra']) 4 PyDev console: starting. 5 Python 3.8.2 (v3.8.2:7b3ab5921f, Feb 24 2020, 17:52:18) 6 [Clang 6.0 (clang-600.0.57)] on darwin 7 >>> runfile('/Users/liuxiaoming/PycharmProjects/LinearAlgebra/main_vector.py', wdir='/Users/liuxiaoming/PycharmProjects/LinearAlgebra') 8 (5, 2) 9 2 10 vec[0] = 5, vec[1] = 2 11 (5, 2) + (3, 1) = (8, 3) 12 (5, 2) - (3, 1) = (2, 1) 13 (5, 2) * 3 = (15, 6) 14 3 * (5, 2) = (15, 6) 15 +(5, 2) = (5, 2) 16 -(5, 2) = (-5, -2) 17 (0, 0) 18 (5, 2) + (0, 0) = (5, 2)