今天我們來講講 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__與之類似,唯一的不同就是它會在使用@ 操作符而不是 + 時被呼叫。
a=a
()b=a
()c=a
@b# __matmul__d=
a@1# __rmatmul__a@=
1#__imatmul__
接下來我們來建立乙個繼承 list 的類並實現矩陣乘法:
class
newlist
(list
):def
__matmul__
(self,v
):result=
fori
inrange
(len
(self
)):result.()
forj
inrange
(len(v
[0])):
result[i
].(0
)foriin
range
(len
(self
)):forjin
range
(len(v
[0])):
fork
inrange
(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
@yforiinz
: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 神秘操作符。
一起學,走得遠!
python 運算子 Python運算子
python語言支援以下型別的運算子 算術運算子 比較 關係 運算子 賦值運算子 邏輯運算子 位運算子 成員運算子 身份運算子 運算子優先順序 1 算術運算子 加號 減號 乘 除 取餘 乘方 整除 1 其中除號 要注意 在python2中,用作整除。解決方法有三 1 兩個相除的數中有乙個為實數。2 ...
python 運算子 python(運算子)
一 運算子 1.算數運算子 1 加 注意 字串與整數之間不能進行相加,需要通過str 或int 進行轉換資料型別 整數與整數相加 1 1 浮點數與浮點數相加 2.0 2.0 4.0 二進位制儲存精度誤差 1.1 1.3 2.4000000000000004 整數與浮點數相加 2 2.0 4.0字串之...
python運算子中 Python中的運算子
python中的運算子 數 算符 比較運算子 邏輯運算子 賦值運算子 1.數 算符 乘法 除法 取模 取餘 求餘數 整除 冪運算 1 和數學中的功能一模一樣,沒有區別 print 1 1 print 1 1 print 1 1 注意 的結果是浮點數。print 1 1 1.0 print 5 2 2...