打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python 中的神秘运算符

今天我们来讲讲 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 @ b140>>> c = numpy.array([[10, 15], [20, 25], [30, 35]])>>> d = numpy.array([[4, 5, 6], [7, 8, 9]])>>> c @ darray([[145, 170, 195], [255, 300, 345],       [365, 430, 495]])

如今,在原生的 Python 代码中,你也可以使用这个运算符。但前提是,你得自己实现具体的运算规则,也就是实现 __matmul__()__rmatmul__() __imatmul__() 这3个方法。

在看实例之前,我们先来了解下这种特殊的类方法。

在官方文档中,我们看到与 __matmul__ 方法一起介绍的还有 __add____sub__ 等等(注意前后都是2个下划线),这些方法都是用来定义此类型的运算符号。

假设现在有一个类叫 A,我们在其 class 中实现了加法方法 __add__

def __add__(self, value):    # 具体实现代码(略)

那么我们就可以在代码中对 A 的实例进行加法运算:

a = A()b = A()c = a + b

此种情况下,__add__ 函数会被调用,self 对应的是 a 变量,而 value 对应的则是 b 变量。

__matmul__ 与之类似,唯一的不同就是它会在使用 @ 操作符而不是 + 时被调用。

同样的道理,__rmatmul__ 对应操作数不支持相关运算或者类型不同的情况,__imatmul__ 则对应复合赋值运算符的情况:

a = A()b = A()c = a @ b  # __matmul__d = a @ 1  # __rmatmul__a @= 1 #__imatmul__

接下来我们来创建一个继承 list 的类并实现矩阵乘法:

class NewList(list): def __matmul__(self, v): result = [] for i in range(len(self)): result.append([]) for j in range(len(v[0])): result[i].append(0)
for i in range(len(self)): for j in range(len(v[0])): for k in range(len(v)): result[i][j] += self[i][k] * v[k][j] return result
# 测试x = NewList([[7, 7, 3], [4, 5, 6], [6, 4, 3]])
y = NewList([[5, 4, 1, 2], [6, 2, 3, 0], [4, 5, 6, 1]])
z = x @ yfor i in z:    print(i)

输出结果:

[89, 57, 46, 17][74, 56, 55, 14][66, 47, 36, 15]

虽然这个符号的设定是用于矩阵乘法,但实际上可以自定义为任何操作。比如我们可以用它来计算直角坐标系上两个点之间的距离

from math import sqrt
class Point: def __init__(self, x, y): self.x = x # x坐标 self.y = y # y坐标
def __matmul__(self, value): x_sub = self.x - value.x y_sub = self.y - value.y return sqrt(x_sub**2 + y_sub**2)
a = Point(1, 3)b = Point(4, 7)print(a @ b)

以上便是我今天跟大家分享的 Python 神秘操作符。

注:本文来自编程教室的读者 @pynickle 即将发布的 GitChat 的一部分。

作者:pynickle

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python五个隐藏的特性,你可能从未听说过
pyalgotrade教程3
给训练踩踩油门:编写高效的PyTorch代码技巧
43
python重载
大白话讲解神经网络算法,原理如此简单!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服