数量乘法实现的疑问

来源:2-5 实现向量的基本运算.

公孙睿Python

2020-02-22

bobo老师,您好!请问在Vector数量乘法中,为什么把__mul__改成__rmul__就可以实现k的位置不同,代码里面好像看不出来?

写回答

2回答

公孙睿Python

提问者

2020-02-23

老师好!我就是区别不出这两个方法有什么不同?

0
7
liuyubobobo
回复
公孙睿Python
我在原回答中做了补充说明。
2020-02-23
共7条回复

liuyubobobo

2020-02-23

我不确定我是不是理解了你的问题。


我们不是把 __mul__ 改成了 __rmul__,而是 添加了 __rmul__ 方法。

__mul__ 定义了 self * k 是如何运算的;

__rmul__ 定义了 k * self 是如何运算的。


==========


在 main 函数中,运行 vec * 3 的过程,就会执行 Vector 类的 __mul__ 逻辑。


Vector 的 __mul__ 逻辑是这样的:

def __mul__(self, k):
    """返回数量乘法的结果向量:self * k"""
    return Vector([k * e for e in self])

这个逻辑已经很完整了,返回了一个新的 Vector 类的对象。这里,我相信你没有问题。


但是,在 main 函数中,计算 3 * vec 的时候,此时,这个 3 在 vec 的左边,不能执行 __mul__,需要执行 __rmul__,这就是我们写 __rmul__ 的意义。


__rmul__ 的逻辑是这样的:

def __rmul__(self, k):
    """返回数量乘法的结果向量:k * self"""
    return self * k


进入 __rmul__ 以后,就一句话,执行 return self * k

此时,为了计算这个 self * k,因为 k 在右边,所以又会调用 __mul__ 的逻辑,进入了这个函数:

def __mul__(self, k):
    """返回数量乘法的结果向量:self * k"""
    return Vector([k * e for e in self])


在 __mul__ 这个函数中,再次按照 __mul__ 的定义,创建了一个新的 Vector,返回了回去。


以上是整个执行过程。


==========


补充说明1:

def __rmul__(k, self) return __mul__ 的写法不对,因为语法不对。


补充说明2:

def __rmul__(self, k):
    """返回数量乘法的结果向量:k * self"""
    return self * k

这个 __rmul__ 函数本质其实就是在说,k * self 的运算结果,和 self * k 一样。


如果还不能理解,把 __rmul__ 写成这样也是正确的:

def __rmul__(self, k):    
    """返回数量乘法的结果向量:k * self"""
    return Vector([k * e for e in self])

如果你还不能理解,我也不知道要怎么解释了。。。


继续加油!:)

0
7
公孙睿Python
回复
liuyubobobo
哦,终于完全明白了,谢谢老师!
2020-02-23
共7条回复

结合编程学数学 专为程序员设计的线性代数

创新设计,通俗易懂。编程结合数学,bobo带你彻底征服线性代数

3404 学习 · 375 问题

查看课程