當編寫含有一個操作符以上的表達式時,Python將按照所謂的優先級法則對其進行分組,這個分組決定了表達式各部分的計算順序。表中的操作符越靠后的優先級越高,位于同一行的表達式在組合的時候通常從左到右組合(除了冪運算,它是從右向左組合的,還有比較運算,是從左到右連接的)。
當使用括號劃分子表達式的時候,就會超越Python的優先級規則。Python總會先執行計算括號中的表達式,然后再將結果用在整個表達式中。
所有的Python操作符可以通過Python的類或C擴展類型被重載(即實現),讓它也能工作于你所創建的對象中。Python自身自動重載了某些操作符,能夠根據所處理的內置對象的類型而執行不同的操作。這種特性通常稱作多態。
下面介紹常用的操作符,其中一些常用于某些類型的操作符,會在后續的介紹對應類型的章節中詳細介紹。
一、賦值運算符
1、 賦值運算符(=)
Python 語言中, 等號( = )是主要的賦值運算符,其他的是增量賦值運算符。
賦值并不是直接將一個值賦給一個變量, 盡管你可能根據其它語言編程經驗認為應該如此。在 Python 語言中,對象是通過引用傳遞的。在賦值時,不管這個對象是新創建的,還是一個已經存在的,都是將該對象的引用(并不是值)賦值給變量(具體原理下面會有詳細介紹)。
同樣的, 如果你比較熟悉 C, 你會知道賦值語句被當成一個表達式(可以返回值)。不過這條并不適合于 Python,Python 的賦值語句不會返回值。
類似下面的語句在 Python 中是非法的:
鏈式賦值沒問題:
2、 增量賦值
等號可以和一個算術運算符組合在一起, 將計算結果重新賦值給左邊的變量,這被稱為增量賦值。增量賦值相對普通賦值不僅僅是寫法上的改變,最有意義的變化是第一個對象(我們例子中的 x)僅被處理一次。如果值是可變對象會被就地修改(無修拷貝引用), 如果值是不可變對象則和 x = x + 1 的結果一樣(x會被分配一個新對象:2)。
注意:Python 不支持 C 語言中的自增 ++和自減 -- 運算符, 這是因為 + 和 - 也是單目運算符,Python 會將 --n 解釋為-(-n) 從而得到 n,同樣 ++n 的結果也是 n。
3、 多重賦值
在上面的例子中,一個值為 1 的整數對象被創建,該對象的同一個引用被賦值給 x、y 和 z 。也就是將一個對象賦給了多個變量。在 Python 當中,將多個對象賦給多個變量也是可以的。
4、“多元”賦值
另一種將多個變量同時賦值的方法我們稱為多元賦值(multuple)。采用這種方式賦值時, 等號兩邊的對象都是元組。在上面的 C 代碼片段中,變量 x 和變量 y 的值被互相交換。 臨時變量 tmp 用于在將 y 賦值給 x 前先保存 x 的值。將 y 的值賦給 x 之后, 才可以將保存在 tmp 變量中的 x 的值賦給 y。Python 的多元賦值方式可以實現無需中間變量交換兩個變量的值。
二、算數運算符
加、減、乘、除和取余都是標準運算符。Python 有兩種除法運算符,單斜杠用作傳統除法(和數學中的除法一樣),雙斜杠用作地板除(取比商小的最大整數)。還有一個乘方運算符, 雙星號(**)。
就象你看到的: + 和 - 優先級最低, *, /, //, %優先級較高, 單目運算符 + 和 - 優先級更高, 乘方的優先級最高。(3 ** 2) 首先求值, 然后是 (-2 * 4), 然后是對兩個結果進行求和。建議對于復雜的運算表達式使用小括號()來限制運算順序,以使代碼更清晰,同時避免錯誤。
下面總結了所有的算術運算符, 從上到下, 計算優先級依次降低:注意: ** 運算符優先級高于單目運算符
X / Y
傳統除法(真除法),無論任何類型都會返回包含任何余數的一個浮點結果。
X // Y
Floor除法,這個操作會取傳統除法的結果之下的最接近的整數,針對整數操作會返回整數,如果有任何一個操作數是浮點數,則返回一個浮點數。其直接效果就是向下舍入,并不是嚴格的截斷。三、比較運算符
比較運算符用來判斷同類型對象是否相等,所有的內建類型均支持比較運算,比較運算返回布爾值 True 或 False。
實際進行的比較運算因類型而異。換言之,數字類型根據數值的大小和符號比較,字符串按照字符序列值進行比較,等等。
注意: Python 目前支持兩種“不等于”比較運算符, != 和 <> , 分別是 C 風格和 ABC/Pascal風格。目前后者慢慢地被淘汰了, 所以我們推薦使用前者 !=。
四、邏輯運算符
邏輯運算符 and 和 or 會判斷表達式中兩側對象的布爾值,并返回一個真或者假的操作對象(并非布爾值)。如果單從bool性考慮:and 運算符只有在兩側對象都為真時,表達式才為真,否則只有有一側對象為假,表達式就為假;or運算符只有在兩側對象都為假時,表達式才為假,否則只要有一側對象為真,表達式就為真。最后表達式返回的是bool值,這是因為比較和相等測試會返回True或False。
在進行and 和 or 的運算時,Python 解釋器會從左至右的運算操作對象的bool值,當運算為and時,解釋器會返回第一個為假的操作對象(可以得到結果),如果兩側操作數都為真,則返回最右側的對象。當運算為or是,解釋器會返回第一個為真的對象(可以得到結果),如果兩側 操作數都為假,則返回最右側的對象。注意: 合理使用括號可以增強代碼的可讀性, 沒用括號的話,可能會使程序得到錯誤結果,或使代碼可讀性降低。括號在 Python語言中不是必須存在的, 不過為了可讀性, 使用括號總是值得的。
五、位運算符
Python 整數 支持標準位運算:取反(~),按位 與(&), 或(|) 及 異或(^) 及左移(<<)和右移(>>)。
Python 這樣處理位運算:
- 負數會被當成正數的 2 進制補碼處理。
- 左移和右移 N 位等同于無溢出檢查的 2 的 N 次冪運算: 2**N。
- 對長整數來說, 位運算符使用一種經修改的 2 進制補碼形式,使得符號位可以無限的
- [圖片上傳中...(7.png-962a19-1515381258065-0)]
向左擴展。
取反(~)運算的優先級與數字單目運算符相同, 是所有位操作符中優先級最高的一個。 左移和右移運算的優先級次之,但低于加減法運算。與, 或, 異或 運算優先級最低。
所有位運算符按優先級高低列在下圖中:《Python基礎手冊》系列:
Python基礎手冊 1 —— Python語言介紹
Python基礎手冊 2 —— Python 環境搭建(Linux)
Python基礎手冊 3 —— Python解釋器
Python基礎手冊 4 —— 文本結構
Python基礎手冊 5 —— 標識符和關鍵字
Python基礎手冊 6 —— 操作符
Python基礎手冊 7 —— 內建函數
Python基礎手冊 8 —— Python對象
Python基礎手冊 9 —— 數字類型
Python基礎手冊10 —— 序列(字符串)
Python基礎手冊11 —— 序列(元組&列表)
Python基礎手冊12 —— 序列(類型操作)
Python基礎手冊13 —— 映射(字典)
Python基礎手冊14 —— 集合
Python基礎手冊15 —— 解析
Python基礎手冊16 —— 文件
Python基礎手冊17 —— 簡單語句
Python基礎手冊18 —— 復合語句(流程控制語句)
Python基礎手冊19 —— 迭代器
Python基礎手冊20 —— 生成器
Python基礎手冊21 —— 函數的定義
Python基礎手冊22 —— 函數的參數
Python基礎手冊23 —— 函數的調用
Python基礎手冊24 —— 函數中變量的作用域
Python基礎手冊25 —— 裝飾器
Python基礎手冊26 —— 錯誤 & 異常
Python基礎手冊27 —— 模塊
Python基礎手冊28 —— 模塊的高級概念
Python基礎手冊29 —— 包