流畅的Python
一般来说加法运算是数学运算中最常见的运算类型。
欧几里得平面几何来说,二维向量加减法无法通过直接的加减运算来实现。
但可以通过一个自建类来实现。
我们也可以通过这个类来理解特殊方法:__repr__,__abs__,__add__,__mul__
我们可以实现自定义Vector类:Vector(2,4) + Vector(5,1) = Vector(7,5)
from math import hypot
class Vector:
def __init__(self,x=0,y=0):
self.x=x
self.y=y
def __repr__(self):
return 'Vector(%r,%r)' % (self.x,self.y)
def __abs__(self):
return hypot(self.x,self.y)
def __bool__(self):
return bool(self.x or self.y)
def __add__(self,other):
x = self.x + other.x
y = self.y + other.y
return Vector(x,y)
def __mul__(self,scalar):
return Vector(self.x * scalar,self.y * scalar)
输出对象
字符串表达形式:__repr__ 在python中我们有一个repr()函数,功能和str()类似都是将对象转换成字符。 但是repr()对于程序执行来说比较友好,而str()对于人机交互输出来说比较友好(不扩展解释) __repr__可以让Vector对象用字符串的形式输出。 否则你得到的仅仅是 <main.Vector at 0x22ed08291c8> 类似的输出。
a = Vector(3,4)
a #在没有定义 __repr__() 的时候输出为: <__main__.Vector at 0x22ed08291c8>
输出为:
Vector(3,4)
算数运算
__add__和__mul__使得Vector类可以进行加法和乘法的运算操作。 我们在进行向量的加和乘操作的时候,返回值是一个新的向量对象。 作为加和乘运算,不影响初始值是应该有的操作。
b = Vector(1,4) + Vector(3,2) +Vector(2,5)
b
输出为:
Vector(6,11)
向量的模(不是绝对值)
计算方法是向量各个元素模的平方之和再开方,又称欧几里得范数。虽然我们用的是 __abs__()但是和我们数学运算中的abs()绝对值还是有区别的。 我们直接调用math.hypot来计算。
c = abs(Vector(3,2)) # 3*3+2*2 = 13 再对13开方
c
输出为:
3.605551275463989
布尔值
作为一个python的有效对象,我们都需要它能够返回一个布尔值用来做逻辑判断。 比如: if语句。对于向量来说,向量模为0我们可以认为其是 False,其它为 True。bool(abs(Vector(3,2)))是一个比较直接的方法,但需要有点运算量。不如直接 bool(self.x or self.y) 判断最初的值是否为0即可。
d = bool(Vector(3,2))
e = bool(Vector(0,0))
print(d,e,sep='\n')
输出为:
True
False