天天看點

Python 中的神秘運算符

原創 pynickle Crossin的程式設計教室 2019-12-23

今天我們來講講 Python 裡一個不為衆人所知的運算符。你可能會覺得疑惑:還有我不知道的運算符?别急着下結論,先往下看看再說。

在 Python3.5 中通過 PEP465

(https://www.python.org/dev/peps/pep-0465)加入了 @運算符,也就是矩陣相乘運算符。雖然目前沒有任何内置的 Python 類型實作了這個運算符的邏輯(就隻是挖了個坑),但是如果你用過 numpy,大概對這個運算符的邏輯并不陌生:

如今,在原生的 Python 代碼中,你也可以使用這個運算符。但前提是,你得自己實作具體的運算規則,也就是實作 __matmul__(),__rmatmul__() 和 __imatmul__() 這3個方法。

在看執行個體之前,我們先來了解下這種特殊的類方法。

在官方文檔中,我們看到與 __matmul__ 方法一起介紹的還有 __add__,__sub__ 等等(注意前後都是2個下劃線),這些方法都是用來定義此類型的運算符号。

假設現在有一個類叫 A,我們在其 class 中實作了加法方法 __add__:

那麼我們就可以在代碼中對 A 的執行個體進行加法運算:

此種情況下,__add__ 函數會被調用,self 對應的是 a 變量,而 value 對應的則是 b 變量。

__matmul__ 與之類似,唯一的不同就是它會在使用 @ 操作符而不是 + 時被調用。

同樣的道理,__rmatmul__ 對應操作數不支援相關運算或者類型不同的情況,__imatmul__ 則對應複合指派運算符的情況:

接下來我們來建立一個繼承 list 的類并實作矩陣乘法:

輸出結果:

雖然這個符号的設定是用于矩陣乘法,但實際上可以自定義為任何操作。比如我們可以用它來計算直角坐标系上兩個點之間的距離:

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

注:本文來自程式設計教室的讀者 @pynickle 即将釋出的 GitChat 的一部分。此次 GitChat 中,他将會介紹一些 Python 的冷知識(但不适合零基礎小白,明天截止預訂),如果你感興趣的話,歡迎加入一起讨論交流。

(點選文末 閱讀原文 可直達)

作者:pynickle