所謂優先級,就是當多個運算符同時出現在一個表達式中時,先執行哪個運算符。
例如對於表達式a + b * c,Python 會先計算乘法再計算加法;b * c的結果為 8,a + 8的結果為 24,所以 d 最終的值也是 24。先計算*再計算+,說明*的優先級高於+。
Python 支持幾十種運算符,被划分成將近二十個優先級,有的運算符優先級不同,有的運算符優先級相同,請看下表。
| 運算符說明 | Python運算符 | 優先級 | 結合性 | 優先級順序 |
|---|---|---|---|---|
| 小括號 | ( ) | 19 | 無 | 高 ︿ | | | | | | | | | | | | | | | | | | | | | | 低 |
| 索引運算符 | x[i] 或 x[i1: i2 [:i3]] | 18 | 左 | |
| 屬性訪問 | x.attribute | 17 | 左 | |
| 乘方 | ** | 16 | 左 | |
| 按位取反 | ~ | 15 | 右 | |
| 符號運算符 | +(正號)、-(負號) | 14 | 右 | |
| 乘除 | *、/、//、% | 13 | 左 | |
| 加減 | +、- | 12 | 左 | |
| 位移 | >>、<< | 11 | 左 | |
| 按位與 | & | 10 | 右 | |
| 按位異或 | ^ | 9 | 左 | |
| 按位或 | | | 8 | 左 | |
| 比較運算符 | ==、!=、>、>=、<、<= | 7 | 左 | |
| is 運算符 | is、is not | 6 | 左 | |
| in 運算符 | in、not in | 5 | 左 | |
| 邏輯非 | not | 4 | 右 | |
| 邏輯與 | and | 3 | 左 | |
| 邏輯或 | or | 2 | 左 | |
| 逗號運算符 | exp1, exp2 | 1 | 左 |
結果表1中的運算符優先級,我們嘗試分析下面表達式的結果:
4+4<<2
+的優先級是 12,<<的優先級是 11,+的優先級高於<<,所以先執行 4+4,得到結果 8,再執行 8<<2,得到結果 32,這也是整個表達式的最終結果。
像這種不好確定優先級的表達式,我們可以給子表達式加上( ),也就是寫成下面的樣子:
(4+4) << 2
這樣看起來就一目了然了,不容易引起誤解。
當然,我們也可以使用( )改變程序的執行順序,比如:
4+(4<<2)
則先執行 4<<2,得到結果 16,再執行 4+16,得到結果20。
雖然 Python 運算符存在優先級的關系,但我不推薦過度依賴運算符的優先級,這會導致程序的可讀性降低。因此,我建議讀者:
- 不要把一個表達式寫得過於復雜,如果一個表達式過於復雜,可以嘗試把它拆分來書寫。
- 不要過多地依賴運算符的優先級來控制表達式的執行順序,這樣可讀性太差,應盡量使用
( )來控制表達式的執行順序。直線電機原理結構圖
Python 運算符結合性
所謂結合性,就是當一個表達式中出現多個優先級相同的運算符時,先執行哪個運算符:先執行左邊的叫左結合性,先執行右邊的叫右結合性。
例如對於表達式對於100 / 25 * 16,/和*的優先級相同,應該先執行哪一個呢?這個時候就不能只依賴運算符優先級決定了,還要參考運算符的結合性。/和*都具有左結合性,因此先執行左邊的除法,再執行右邊的乘法,最終結果是 64。
Python 中大部分運算符都具有左結合性,也就是從左到右執行;只有單目運算符(例如 not 邏輯非運算符)、賦值運算符和三目運算符例外,它們具有右結合性,也就是從右向左執行。表 1 中列出了所有 Python 運算符的結合性。
總結
當一個表達式中出現多個運算符時,Python 會先比較各個運算符的優先級,按照優先級從高到低的順序依次執行;當遇到優先級相同的運算符時,再根據結合性決定先執行哪個運算符:如果是左結合性就先執行左邊的運算符,如果是右結合性就先執行右邊的運算符。
