Python基礎(chǔ)手冊(cè)6——操作符

下面為Python所有的操作符表達(dá)式(摘自Mark Lutz的《Python學(xué)習(xí)手冊(cè)》)。

當(dāng)編寫(xiě)含有一個(gè)操作符以上的表達(dá)式時(shí),Python將按照所謂的優(yōu)先級(jí)法則對(duì)其進(jìn)行分組,這個(gè)分組決定了表達(dá)式各部分的計(jì)算順序。表中的操作符越靠后的優(yōu)先級(jí)越高,位于同一行的表達(dá)式在組合的時(shí)候通常從左到右組合(除了冪運(yùn)算,它是從右向左組合的,還有比較運(yùn)算,是從左到右連接的)。

當(dāng)使用括號(hào)劃分子表達(dá)式的時(shí)候,就會(huì)超越Python的優(yōu)先級(jí)規(guī)則。Python總會(huì)先執(zhí)行計(jì)算括號(hào)中的表達(dá)式,然后再將結(jié)果用在整個(gè)表達(dá)式中。

所有的Python操作符可以通過(guò)Python的類或C擴(kuò)展類型被重載(即實(shí)現(xiàn)),讓它也能工作于你所創(chuàng)建的對(duì)象中。Python自身自動(dòng)重載了某些操作符,能夠根據(jù)所處理的內(nèi)置對(duì)象的類型而執(zhí)行不同的操作。這種特性通常稱作多態(tài)。

下面介紹常用的操作符,其中一些常用于某些類型的操作符,會(huì)在后續(xù)的介紹對(duì)應(yīng)類型的章節(jié)中詳細(xì)介紹。

一、賦值運(yùn)算符

1、 賦值運(yùn)算符(=)

Python 語(yǔ)言中, 等號(hào)( = )是主要的賦值運(yùn)算符,其他的是增量賦值運(yùn)算符。

賦值并不是直接將一個(gè)值賦給一個(gè)變量, 盡管你可能根據(jù)其它語(yǔ)言編程經(jīng)驗(yàn)認(rèn)為應(yīng)該如此。在 Python 語(yǔ)言中,對(duì)象是通過(guò)引用傳遞的。在賦值時(shí),不管這個(gè)對(duì)象是新創(chuàng)建的,還是一個(gè)已經(jīng)存在的,都是將該對(duì)象的引用(并不是值)賦值給變量(具體原理下面會(huì)有詳細(xì)介紹)。

同樣的, 如果你比較熟悉 C, 你會(huì)知道賦值語(yǔ)句被當(dāng)成一個(gè)表達(dá)式(可以返回值)。不過(guò)這條并不適合于 Python,Python 的賦值語(yǔ)句不會(huì)返回值。

類似下面的語(yǔ)句在 Python 中是非法的:


鏈?zhǔn)劫x值沒(méi)問(wèn)題:


2、 增量賦值

等號(hào)可以和一個(gè)算術(shù)運(yùn)算符組合在一起, 將計(jì)算結(jié)果重新賦值給左邊的變量,這被稱為增量賦值。

增量賦值運(yùn)算符:

增量賦值相對(duì)普通賦值不僅僅是寫(xiě)法上的改變,最有意義的變化是第一個(gè)對(duì)象(我們例子中的 x)僅被處理一次。如果值是可變對(duì)象會(huì)被就地修改(無(wú)修拷貝引用), 如果值是不可變對(duì)象則和 x = x + 1 的結(jié)果一樣(x會(huì)被分配一個(gè)新對(duì)象:2)。

注意:Python 不支持 C 語(yǔ)言中的自增 ++和自減 -- 運(yùn)算符, 這是因?yàn)?+ 和 - 也是單目運(yùn)算符,Python 會(huì)將 --n 解釋為-(-n) 從而得到 n,同樣 ++n 的結(jié)果也是 n。

3、 多重賦值


在上面的例子中,一個(gè)值為 1 的整數(shù)對(duì)象被創(chuàng)建,該對(duì)象的同一個(gè)引用被賦值給 x、y 和 z 。也就是將一個(gè)對(duì)象賦給了多個(gè)變量。在 Python 當(dāng)中,將多個(gè)對(duì)象賦給多個(gè)變量也是可以的。

4、“多元”賦值

另一種將多個(gè)變量同時(shí)賦值的方法我們稱為多元賦值(multuple)。采用這種方式賦值時(shí), 等號(hào)兩邊的對(duì)象都是元組。

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

在其它類似 C 的語(yǔ)言中, 如果你要交換兩個(gè)值, 你會(huì)想到使用一個(gè)臨時(shí)變量比如 tmp 來(lái)臨時(shí)保存其中一個(gè)值:

在上面的 C 代碼片段中,變量 x 和變量 y 的值被互相交換。 臨時(shí)變量 tmp 用于在將 y 賦值給 x 前先保存 x 的值。將 y 的值賦給 x 之后, 才可以將保存在 tmp 變量中的 x 的值賦給 y。Python 的多元賦值方式可以實(shí)現(xiàn)無(wú)需中間變量交換兩個(gè)變量的值。



二、算數(shù)運(yùn)算符

加、減、乘、除和取余都是標(biāo)準(zhǔn)運(yùn)算符。Python 有兩種除法運(yùn)算符,單斜杠用作傳統(tǒng)除法(和數(shù)學(xué)中的除法一樣),雙斜杠用作地板除(取比商小的最大整數(shù))。還有一個(gè)乘方運(yùn)算符, 雙星號(hào)(**)。

就象你看到的: + 和 - 優(yōu)先級(jí)最低, *, /, //, %優(yōu)先級(jí)較高, 單目運(yùn)算符 + 和 - 優(yōu)先級(jí)更高, 乘方的優(yōu)先級(jí)最高。(3 ** 2) 首先求值, 然后是 (-2 * 4), 然后是對(duì)兩個(gè)結(jié)果進(jìn)行求和。建議對(duì)于復(fù)雜的運(yùn)算表達(dá)式使用小括號(hào)()來(lái)限制運(yùn)算順序,以使代碼更清晰,同時(shí)避免錯(cuò)誤。

下面總結(jié)了所有的算術(shù)運(yùn)算符, 從上到下, 計(jì)算優(yōu)先級(jí)依次降低:

注意: ** 運(yùn)算符優(yōu)先級(jí)高于單目運(yùn)算符

X / Y

傳統(tǒng)除法(真除法),無(wú)論任何類型都會(huì)返回包含任何余數(shù)的一個(gè)浮點(diǎn)結(jié)果。

X // Y

Floor除法,這個(gè)操作會(huì)取傳統(tǒng)除法的結(jié)果之下的最接近的整數(shù),針對(duì)整數(shù)操作會(huì)返回整數(shù),如果有任何一個(gè)操作數(shù)是浮點(diǎn)數(shù),則返回一個(gè)浮點(diǎn)數(shù)。其直接效果就是向下舍入,并不是嚴(yán)格的截?cái)唷?div id="u0z1t8os" class="image-package">



三、比較運(yùn)算符

比較運(yùn)算符用來(lái)判斷同類型對(duì)象是否相等,所有的內(nèi)建類型均支持比較運(yùn)算,比較運(yùn)算返回布爾值 True 或 False。


實(shí)際進(jìn)行的比較運(yùn)算因類型而異。換言之,數(shù)字類型根據(jù)數(shù)值的大小和符號(hào)比較,字符串按照字符序列值進(jìn)行比較,等等。

注意: Python 目前支持兩種“不等于”比較運(yùn)算符, != 和 <> , 分別是 C 風(fēng)格和 ABC/Pascal風(fēng)格。目前后者慢慢地被淘汰了, 所以我們推薦使用前者 !=。

四、邏輯運(yùn)算符

邏輯運(yùn)算符 and 和 or 會(huì)判斷表達(dá)式中兩側(cè)對(duì)象的布爾值,并返回一個(gè)真或者假的操作對(duì)象(并非布爾值)。如果單從bool性考慮:and 運(yùn)算符只有在兩側(cè)對(duì)象都為真時(shí),表達(dá)式才為真,否則只有有一側(cè)對(duì)象為假,表達(dá)式就為假;or運(yùn)算符只有在兩側(cè)對(duì)象都為假時(shí),表達(dá)式才為假,否則只要有一側(cè)對(duì)象為真,表達(dá)式就為真。

當(dāng)然,我們還可以使用邏輯運(yùn)算符 and 和 or 將任意表達(dá)式連接在一起,并得到一個(gè)布爾值:

最后表達(dá)式返回的是bool值,這是因?yàn)楸容^和相等測(cè)試會(huì)返回True或False。

在進(jìn)行and 和 or 的運(yùn)算時(shí),Python 解釋器會(huì)從左至右的運(yùn)算操作對(duì)象的bool值,當(dāng)運(yùn)算為and時(shí),解釋器會(huì)返回第一個(gè)為假的操作對(duì)象(可以得到結(jié)果),如果兩側(cè)操作數(shù)都為真,則返回最右側(cè)的對(duì)象。當(dāng)運(yùn)算為or是,解釋器會(huì)返回第一個(gè)為真的對(duì)象(可以得到結(jié)果),如果兩側(cè) 操作數(shù)都為假,則返回最右側(cè)的對(duì)象。

not 運(yùn)算符擁有最高優(yōu)先級(jí),只比所有比較運(yùn)算符低一級(jí)。 and 和 or 運(yùn)算符則相應(yīng)的再低一級(jí)。not會(huì)返回對(duì)象的bool值的對(duì)立bool值。

注意: 合理使用括號(hào)可以增強(qiáng)代碼的可讀性, 沒(méi)用括號(hào)的話,可能會(huì)使程序得到錯(cuò)誤結(jié)果,或使代碼可讀性降低。括號(hào)在 Python語(yǔ)言中不是必須存在的, 不過(guò)為了可讀性, 使用括號(hào)總是值得的。

五、位運(yùn)算符

Python 整數(shù) 支持標(biāo)準(zhǔn)位運(yùn)算:取反(~),按位 與(&), 或(|) 及 異或(^) 及左移(<<)和右移(>>)。

Python 這樣處理位運(yùn)算:

  • 負(fù)數(shù)會(huì)被當(dāng)成正數(shù)的 2 進(jìn)制補(bǔ)碼處理。
  • 左移和右移 N 位等同于無(wú)溢出檢查的 2 的 N 次冪運(yùn)算: 2**N。
  • 對(duì)長(zhǎng)整數(shù)來(lái)說(shuō), 位運(yùn)算符使用一種經(jīng)修改的 2 進(jìn)制補(bǔ)碼形式,使得符號(hào)位可以無(wú)限的
  • [圖片上傳中...(7.png-962a19-1515381258065-0)]
    向左擴(kuò)展。

取反(~)運(yùn)算的優(yōu)先級(jí)與數(shù)字單目運(yùn)算符相同, 是所有位操作符中優(yōu)先級(jí)最高的一個(gè)。 左移和右移運(yùn)算的優(yōu)先級(jí)次之,但低于加減法運(yùn)算。與, 或, 異或 運(yùn)算優(yōu)先級(jí)最低。

所有位運(yùn)算符按優(yōu)先級(jí)高低列在下圖中:


《Python基礎(chǔ)手冊(cè)》系列:

Python基礎(chǔ)手冊(cè) 1 —— Python語(yǔ)言介紹
Python基礎(chǔ)手冊(cè) 2 —— Python 環(huán)境搭建(Linux)
Python基礎(chǔ)手冊(cè) 3 —— Python解釋器
Python基礎(chǔ)手冊(cè) 4 —— 文本結(jié)構(gòu)
Python基礎(chǔ)手冊(cè) 5 —— 標(biāo)識(shí)符和關(guān)鍵字
Python基礎(chǔ)手冊(cè) 6 —— 操作符
Python基礎(chǔ)手冊(cè) 7 —— 內(nèi)建函數(shù)
Python基礎(chǔ)手冊(cè) 8 —— Python對(duì)象
Python基礎(chǔ)手冊(cè) 9 —— 數(shù)字類型
Python基礎(chǔ)手冊(cè)10 —— 序列(字符串)
Python基礎(chǔ)手冊(cè)11 —— 序列(元組&列表)
Python基礎(chǔ)手冊(cè)12 —— 序列(類型操作)
Python基礎(chǔ)手冊(cè)13 —— 映射(字典)
Python基礎(chǔ)手冊(cè)14 —— 集合
Python基礎(chǔ)手冊(cè)15 —— 解析
Python基礎(chǔ)手冊(cè)16 —— 文件
Python基礎(chǔ)手冊(cè)17 —— 簡(jiǎn)單語(yǔ)句
Python基礎(chǔ)手冊(cè)18 —— 復(fù)合語(yǔ)句(流程控制語(yǔ)句)
Python基礎(chǔ)手冊(cè)19 —— 迭代器
Python基礎(chǔ)手冊(cè)20 —— 生成器
Python基礎(chǔ)手冊(cè)21 —— 函數(shù)的定義
Python基礎(chǔ)手冊(cè)22 —— 函數(shù)的參數(shù)
Python基礎(chǔ)手冊(cè)23 —— 函數(shù)的調(diào)用
Python基礎(chǔ)手冊(cè)24 —— 函數(shù)中變量的作用域
Python基礎(chǔ)手冊(cè)25 —— 裝飾器
Python基礎(chǔ)手冊(cè)26 —— 錯(cuò)誤 & 異常
Python基礎(chǔ)手冊(cè)27 —— 模塊
Python基礎(chǔ)手冊(cè)28 —— 模塊的高級(jí)概念
Python基礎(chǔ)手冊(cè)29 —— 包

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容