本節教程將講解 Python 運算符的優先級和關聯性,在這以前你應該理解了 Python 運算符。python
對於表達式,Python 解釋器將處理優先級更高的運算符,而且除了指數運算符(**)外,幾乎全部運算符的處理方式都從左到右執行。函數
當咱們將值、變量、運算符和函數調用放在一塊兒時,就會造成表達式。當表達式執行完後,Python 解釋器就會把它認爲是有效的表達式。post
像這樣:spa
>>> 3 + 4
7
複製代碼
3 + 4 是一個表達式,它包含一個運算符和兩個操做數。因此,一個複雜的語句能夠包含多個運算符。爲了執行復雜的表達式,Python 須要列出運算符的優先級,就是要控制程序操做的順序。code
下面是一個複合表達式包含多個運算符的例子:教程
# 先作乘法再作加法結果就是 17
5 + 4 * 3
複製代碼
也能夠使用括號 ()
更改操做順序,括號比算數運算符優先級更高:索引
# 先作括號內加法再作乘法結果是 27
(5 + 4) * 3
複製代碼
下面用表格列出運算符從高到低的優先級:get
運算符 | 用法 |
---|---|
{ } | 括號(分組) |
f(args...) | 函數調用 |
x[index:index] | 切片 |
x[index] | 索引值 |
x.attribute | 屬性 |
** | 指數 |
~x | 取反 |
+x,-x | 正、負值 |
*、/、% | 乘、除、求餘 |
+、- | 加、減 |
<<、>> | 左移、右移 |
& | 按位 AND |
^ | 按位 XOR |
| | 按位 OR |
is、not、in、is、is not、< 、<=、>、>=、<>、!=、== | 比較、算數、身份 |
not x | 布爾 NOT |
and | 布爾 AND |
or | 布爾 OR |
lambda | lambda 表達式 |
上表每組能夠有多個運算符,這意味着此組運算符的優先級都相同。因此當多個運算符有相同優先級時,它們之間的關聯性就決定了最後的執行順序。table
當有多個相同優先級運算符一同處理時,除指數(**)外,Python 都將按照從左到右的順序依次執行。class
舉個例子:
# 具備相同優先級,從左到右執行結果爲 1
print(4 * 7 % 3)
# 括號有更高優先級,執行結果爲 0
print(2 * (10 % 5))
複製代碼
提到過其中指數(**)運算符不一樣,它是按照從右向左順序執行:
# 從右到左執行結果爲 256
print(4 ** 2 ** 2)
# 括號有更高優先級,可是執行結果還會爲 256
print((4 ** 2) ** 2)
複製代碼
Python 中其實還有一些不支持關聯性的運算符,例如賦值運算符和比較運算符。因此針對這些非關聯運算符有特殊的規則,這就須要咱們特別記憶。
例如表達式 5 < 7 < 9
不能理解成 (5 < 7) < 9
或 5 < (7 < 9)
,而是應該當作 5 < 7 and 7 < 9
且從左到右求值。
還有對語法的支持,像 a = b = c
這樣的賦值運算符是可執行的,可是像 a = b += c
就會出現錯誤。
x = 11, y = 12, z = 13
# 不正確的表達式
# 非關聯運算符
# 錯誤 -> SyntaxError: invalid syntax
x = y += 12
複製代碼
(完)