python中的运算符_Python 中的神秘运算符
今天我們來(lái)講講 Python 里一個(gè)不為眾人所知的運(yùn)算符。你可能會(huì)覺(jué)得疑惑:還有我不知道的運(yùn)算符?別急著下結(jié)論,先往下看看再說(shuō)。
在 Python3.5 中通過(guò) PEP465https://www.python.org/dev/peps/pep-0465 加入了 @運(yùn)算符,也就是矩陣相乘運(yùn)算符。雖然目前沒(méi)有任何內(nèi)置的 Python 類(lèi)型實(shí)現(xiàn)了這個(gè)運(yùn)算符的邏輯(就只是挖了個(gè)坑),但是如果你用過(guò) numpy,大概對(duì)這個(gè)運(yùn)算符的邏輯并不陌生:
>>> 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 代碼中,你也可以使用這個(gè)運(yùn)算符。但前提是,你得自己實(shí)現(xiàn)具體的運(yùn)算規(guī)則,也就是實(shí)現(xiàn) __matmul__(),__rmatmul__() 和 __imatmul__() 這3個(gè)方法。
在看實(shí)例之前,我們先來(lái)了解下這種特殊的類(lèi)方法。
在官方文檔中,我們看到與 __matmul__方法一起介紹的還有 __add__,__sub__ 等等(注意前后都是2個(gè)下劃線),這些方法都是用來(lái)定義此類(lèi)型的運(yùn)算符號(hào)。
假設(shè)現(xiàn)在有一個(gè)類(lèi)叫 A,我們?cè)谄?class 中實(shí)現(xiàn)了加法方法 __add__:
def __add__(self, value):
# 具體實(shí)現(xiàn)代碼(略)
那么我們就可以在代碼中對(duì) A 的實(shí)例進(jìn)行加法運(yùn)算:
a = A()
b = A()
c = a + b
此種情況下,__add__ 函數(shù)會(huì)被調(diào)用,self 對(duì)應(yīng)的是 a 變量,而 value 對(duì)應(yīng)的則是 b 變量。
__matmul__與之類(lèi)似,唯一的不同就是它會(huì)在使用 @ 操作符而不是 + 時(shí)被調(diào)用。
同樣的道理,__rmatmul__ 對(duì)應(yīng)操作數(shù)不支持相關(guān)運(yùn)算或者類(lèi)型不同的情況,__imatmul__ 則對(duì)應(yīng)復(fù)合賦值運(yùn)算符的情況:
a = A()
b = A()
c = a @ b # __matmul__
d = a @ 1 # __rmatmul__
a @= 1 #__imatmul__
接下來(lái)我們來(lái)創(chuàng)建一個(gè)繼承 list 的類(lèi)并實(shí)現(xiàn)矩陣乘法:
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
# 測(cè)試
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)
輸出結(jié)果:
[89, 57, 46, 17]
[74, 56, 55, 14]
[66, 47, 36, 15]
雖然這個(gè)符號(hào)的設(shè)定是用于矩陣乘法,但實(shí)際上可以自定義為任何操作。比如我們可以用它來(lái)計(jì)算直角坐標(biāo)系上兩個(gè)點(diǎn)之間的距離:
from math import sqrt
class Point:
def __init__(self, x, y):
self.x = x # x坐標(biāo)
self.y = y # y坐標(biāo)
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 神秘操作符。
注:本文來(lái)自編程教室的讀者 @pynickle 的投稿
------
一起學(xué),走得遠(yuǎn)!
歡迎搜索:Crossin的編程教室
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python中的运算符_Python 中的神秘运算符的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安康看卵巢早衰最好的医院推荐
- 下一篇: python提取包含特定字符串的行_py