![e73f2fe299f858edcee26b45284ca0c4.png](https://i-blog.csdnimg.cn/blog_migrate/b3643abf92177f665dbf0aaa506d35d3.jpeg)
今天我们来讲讲 Python 里一个不为众人所知的运算符。你可能会觉得疑惑:还有我不知道的运算符?别急着下结论,先往下看看再说。
在 Python3.5 中通过 PEP465 https://www.python.org/dev/peps/pep-0465 加入了 @运算符,也就是矩阵相乘运算符。虽然目前没有任何内置的 Python 类型实现了这个运算符的逻辑(就只是挖了个坑),但是如果你用过 numpy,大概对这个运算符的逻辑并不陌生:
>>> a = numpy.array([1, 2, 3])
>>> b = numpy.array([10, 20, 30])
>>> a @ b
140
>>> c = numpy.array([[10, 15], [20, 25], [30, 35]])
>>> d = numpy.array([[4, 5, 6], [7, 8, 9]])
>>> c @ d
array([[145, 170, 195],
[255, 300, 345],
[365, 430, 495]])
如今,在原生的 Python 代码中,你也可以使用这个运算符。但前提是,你得自己实现具体的运算规则,也就是实现 __matmul__(),__rmatmul__() 和 __imatmul__() 这3个方法。
在看实例之前,我们先来了解下这种特殊的类方法。
在官方文档中,我们看到与 __matmul__ 方法一起介绍的还有 __add__,__sub__ 等等(注意前后都是2个下划线),这些方法都是用来定义此类型的运算符号。
假设现在有一个类叫 A,我们在其 class 中实现了加法方法 __add__:
def
那么我们就可以在代码中对 A 的实例进行加法运算:
a
此种情况下,__add__ 函数会被调用,self 对应的是 a 变量,而 value 对应的则是 b 变量。
__matmul__ 与之类似,唯一的不同就是它会在使用 @ 操作符而不是 + 时被调用。
同样的道理,__rmatmul__ 对应操作数不支持相关运算或者类型不同的情况,__imatmul__ 则对应复合赋值运算符的情况:
a
接下来我们来创建一个继承 list 的类并实现矩阵乘法:
class
输出结果:
[89, 57, 46, 17]
[74, 56, 55, 14]
[66, 47, 36, 15]
虽然这个符号的设定是用于矩阵乘法,但实际上可以自定义为任何操作。比如我们可以用它来计算直角坐标系上两个点之间的距离:
from
以上便是我今天跟大家分享的 Python 神秘操作符。
注:本文来自编程教室的读者 @pynickle 的投稿
------
一起学,走得远!
欢迎搜索:Crossin的编程教室