Python基礎手冊6——操作符

下面為Python所有的操作符表達式(摘自Mark Lutz的《Python學習手冊》)。

當編寫含有一個操作符以上的表達式時,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)。采用這種方式賦值時, 等號兩邊的對象都是元組。

在上面的例子里, 兩個整數對象(值分別為 1 和 2)及一個字符串對象, 被分別賦值給x,y 和 z。通常元組需要用圓括號(小括號)括起來,盡管它們是可選的。我們建議總是加上圓括號以使得你的代碼有更高的可讀性。

在其它類似 C 的語言中, 如果你要交換兩個值, 你會想到使用一個臨時變量比如 tmp 來臨時保存其中一個值:

在上面的 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運算符只有在兩側對象都為假時,表達式才為假,否則只要有一側對象為真,表達式就為真。

當然,我們還可以使用邏輯運算符 and 和 or 將任意表達式連接在一起,并得到一個布爾值:

最后表達式返回的是bool值,這是因為比較和相等測試會返回True或False。

在進行and 和 or 的運算時,Python 解釋器會從左至右的運算操作對象的bool值,當運算為and時,解釋器會返回第一個為假的操作對象(可以得到結果),如果兩側操作數都為真,則返回最右側的對象。當運算為or是,解釋器會返回第一個為真的對象(可以得到結果),如果兩側 操作數都為假,則返回最右側的對象。

not 運算符擁有最高優先級,只比所有比較運算符低一級。 and 和 or 運算符則相應的再低一級。not會返回對象的bool值的對立bool值。

注意: 合理使用括號可以增強代碼的可讀性, 沒用括號的話,可能會使程序得到錯誤結果,或使代碼可讀性降低。括號在 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 —— 包

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373