所謂優先級,就是當多個運算符同時出現在一個表達式中時,先執行哪個運算符。
例如對於表達式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 會先比較各個運算符的優先級,按照優先級從高到低的順序依次執行;當遇到優先級相同的運算符時,再根據結合性決定先執行哪個運算符:如果是左結合性就先執行左邊的運算符,如果是右結合性就先執行右邊的運算符。