今天我们来讲讲 Python 里一个不为众人所知的运算符。你可能会觉得疑惑:还有我不知道的运算符?别急着下结论,先往下看看再说。

在 Python3.5 中通过 PEP465https://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 __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 @ y

for 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 的投稿

------

一起学,走得远!

欢迎搜索:Crossin的编程教室

python中的运算符_Python 中的神秘运算符相关推荐

  1. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  2. python中定义数据结构_Python中的数据结构—简介

    python中定义数据结构 You have multiples algorithms, the steps of which require fetching the smallest value ...

  3. python中 是什么运算符_Python中什么是算术运算符、赋值运算符和复合运算符?...

    本篇文章给大家带来的内容是介绍Python中什么是算术运算符.赋值运算符和复合运算符.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助. 算术运算符 常见的算术运算符有 : + 加法运算符 ...

  4. python整商运算符_python中的运算符

    一.python中的运算符主要分为 算数运算符.赋值运算符.比较运算符.逻辑运算符 1.算数运算符: 1)加减乘除 注意: (1)除法的结果是浮点数 (2)除法会遇到除不尽的情况 (3)被除数不能为0 ...

  5. python语言的取余运算符_Python 中用于整数除法取余的运算符是()_学小易找答案...

    [填空题]隐球菌病多由()传播. [单选题]下列选项中,哪一个符号是管道符号. ( ) [多选题]可采用分批法计算产品成本的企业有( ) [填空题]现有字符串 s="1234567" ...

  6. python中基本运算符_Python中的基本运算符及示例

    python中基本运算符 Operators are symbols which tells the interpreter to do a specific operation such as ar ...

  7. python中没有++和--这两个运算符_python为什么没有++和 – – 运算符

    为什么python中没有++和--操作符? python中递增和递减运算符的相关post行为 因为-Python不是C! 这并不是因为它没有意义:把"x++"定义为"x+ ...

  8. python中算术运算符_python中的基本算术运算符有哪些

    python中的基本算术运算符有哪些 发布时间:2020-11-16 14:54:33 来源:亿速云 阅读:74 今天就跟大家聊聊有关python中的基本算术运算符有哪些,可能很多人都不太了解,为了让 ...

  9. python中while嵌套循环_python中的while循环

    循环 目标 程序的三大流程  while 循环基本使用  break 和 continue  while 循环嵌套 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 -- 从上向下,顺 ...

最新文章

  1. 一口气说出 Redis 16 个常见使用场景
  2. 多家巨头实测鸿蒙系统:比安卓快60%
  3. DNS基本原理与配置
  4. 用access做考场桌贴_利用Word、Excel、Access进行考务安排及学生成绩分析的有效途径-教育文档...
  5. Windows 8.1 重复数据删除
  6. 计算机中的信息表示 ppt模板,计算机中信息的表示.ppt
  7. 【DND图形库】二、创建控制台窗口和游戏循环
  8. “菜”鸟理解.NET Framework(CLI,CLS,CTS,CLR,FCL,BCL)
  9. mysql索引使增删变慢_mysql优化之索引篇
  10. Oreo授权系统V1.0.6公益开源版本源码
  11. C++builder Tokyo 调用com 不正确的变量类型
  12. Vue的mergeOptions函数分析-下
  13. C/C++ 安全编码 —— 指针与内存
  14. php字符是汉字还是字符,php判断字符串中是否包含中文汉字和获得字符串中的汉字...
  15. java id3v2 乱码,Mp3标签乱码问题分析与解决方案
  16. lae界面开发工具入门之介绍三--布局篇
  17. windows server 系统SERVER服务消失无法共享
  18. matlab算kdj指标,通达信带注释的KDJ指标公式
  19. VMWARE虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机。
  20. 2837xd 代码生成——补充(3)

热门文章

  1. 网页设计html加音频,HTML5网页中如何嵌入音频,视频?
  2. java项目processes设置,Jvm调优和SpringBoot项目优化的详细教程
  3. 我是如何使用git把本地代码上传到github上的,值得借鉴
  4. json-schema 可视化编辑器发布了
  5. Html5结合JS实现浏览器全屏功能
  6. CSS布局(五) 网页布局方式
  7. 控制元素的div属性
  8. 安装vue-cli时报错
  9. spoj1026 favorite dice
  10. windows下github 出现Permission denied (publickey)