流畅的Python---向量(魔术方法:__repr__ 与 __abs__与__bool__与__add__与__mul__)

常用Python的模块(math)、魔术方法(__repr__ 与 __abs__与__bool__与__add__与__mul__)构建二维向量

  1.模块math中的常用方法:    

    math.e 自然常数e >>> math.e 2.718281828459045
    math.pi 圆周率pi >>> math.pi 3.141592653589793
    math.degrees(x) 弧度转度 >>> math.degrees(math.pi) 180.0
    math.radians(x) 度转弧度 >>> math.radians(45) 0.7853981633974483
    math.exp(x) 返回e的x次方 >>> math.exp(2) 7.38905609893065
    math.expm1(x) 返回e的x次方减1 >>> math.expm1(2) 6.38905609893065
    math.log(x[, base]) 返回x的以base为底的对数,base默认为e >>> math.log(math.e) 1.0 >>> math.log(2, 10) 0.30102999566398114
    math.log10(x) 返回x的以10为底的对数 >>> math.log10(2) 0.30102999566398114
    math.log1p(x) 返回1+x的自然对数(以e为底) >>> math.log1p(math.e-1) 1.0
    math.pow(x, y) 返回x的y次方 >>> math.pow(5,3) 125.0
    math.sqrt(x) 返回x的平方根 >>> math.sqrt(3) 1.7320508075688772
    math.ceil(x) 返回不小于x的整数 >>> math.ceil(5.2) 6.0
    math.floor(x) 返回不大于x的整数 >>> math.floor(5.8) 5.0
    math.trunc(x) 返回x的整数部分 >>> math.trunc(5.8) 5
    math.modf(x) 返回x的小数和整数 >>> math.modf(5.2) (0.20000000000000018, 5.0)
    math.fabs(x) 返回x的绝对值 >>> math.fabs(-5) 5.0
    math.fmod(x, y) 返回x%y(取余) >>> math.fmod(5,2) 1.0
    math.fsum([x, y, ...]) 返回无损精度的和 >>> 0.1+0.2+0.3 0.6000000000000001 >>> math.fsum([0.1, 0.2, 0.3]) 0.6
    math.factorial(x) 返回x的阶乘 >>> math.factorial(5) 120
    math.isinf(x) 若x为无穷大,返回True;否则,返回False >>> math.isinf(1.0e+308) False >>> math.isinf(1.0e+309) True
    math.isnan(x) 若x不是数字,返回True;否则,返回False >>> math.isnan(1.2e3) False
    math.hypot(x, y) 返回以x和y为直角边的斜边长 >>> math.hypot(3,4) 5.0
    math.copysign(x, y) 若y<0,返回-1乘以x的绝对值; 否则,返回x的绝对值 >>> math.copysign(5.2, -1) -5.2
    math.frexp(x) 返回m和i,满足m乘以2的i次方 >>> math.frexp(3) (0.75, 2)
    math.ldexp(m, i) 返回m乘以2的i次方 >>> math.ldexp(0.75, 2) 3.0
    math.sin(x) 返回x(弧度)的三角正弦值 >>> math.sin(math.radians(30)) 0.49999999999999994
    math.asin(x) 返回x的反三角正弦值 >>> math.asin(0.5) 0.5235987755982989
    math.cos(x) 返回x(弧度)的三角余弦值 >>> math.cos(math.radians(45)) 0.7071067811865476
    math.acos(x) 返回x的反三角余弦值 >>> math.acos(math.sqrt(2)/2) 0.7853981633974483
    math.tan(x) 返回x(弧度)的三角正切值 >>> math.tan(math.radians(60)) 1.7320508075688767
    math.atan(x) 返回x的反三角正切值 >>> math.atan(1.7320508075688767) 1.0471975511965976
    math.atan2(x, y) 返回x/y的反三角正切值 >>> math.atan2(2,1) 1.1071487177940904
    math.sinh(x) 返回x的双曲正弦函数
    math.asinh(x) 返回x的反双曲正弦函数
    math.cosh(x) 返回x的双曲余弦函数
    math.acosh(x) 返回x的反双曲余弦函数
    math.tanh(x) 返回x的双曲正切函数
    math.atanh(x) 返回x的反双曲正切函数
    math.erf(x) 返回x的误差函数
    math.erfc(x) 返回x的余误差函数
    math.gamma(x) 返回x的伽玛函数
    math.lgamma(x) 返回x的绝对值的自然对数的伽玛函数

  2. 简单的二维向量

      

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(abs(self))
    def __add__(self, other):
        x = self.x + other.x
        y = self.x + other.y
        return Vector(x, y)
    def __mul__(self, scalar):
        return Vector(self.x * scalar,self.y * scalar)

# 向量加法
v1 = Vector(2,4)
v2 = Vector(1,2)
print(v1+v2)

#向量求模
v3 = Vector(3,4)
print(abs(v3))

#向量的标量乘法
print(abs(v3 * 3))
v4 = v3 * (-3)
print(v4)
print(abs(v4))

  还可以继续自定其他的跟运算相关的特殊方法,使这个向量类更加强大

      

posted @ 2019-04-11 22:14  CoyLee  阅读(301)  评论(0编辑  收藏  举报