Python 中的神秘運算子

2021-10-16 17:50:37 字數 2966 閱讀 5621

今天我們來講講 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...