運(yùn)算符和操作對(duì)象是計(jì)算機(jī)中比較常見(jiàn)的,所有計(jì)算都涉及運(yùn)算符和操作對(duì)象。本節(jié)將介紹Python中的運(yùn)算符和操作對(duì)象。
什么是運(yùn)算符和操作對(duì)象:
運(yùn)算符是一些特殊符號(hào)的集合,我們前面學(xué)習(xí)的加(+)、減(-)、乘(*)、除(/)、地板除(//)、取余(%)等都是運(yùn)算符。操作對(duì)象是由運(yùn)算符連接起來(lái)的對(duì)象。加、減、乘、除4種運(yùn)算符是我們從小學(xué)就開(kāi)始接觸的,不過(guò)乘除的寫(xiě)法不一樣,這個(gè)要記住。小萌看到這個(gè)標(biāo)題后快速回憶,這個(gè)學(xué)習(xí)方式不錯(cuò),不但能溫故知新,還做了聯(lián)想記憶和縱向比對(duì),值得借鑒。
Python支持以下8種運(yùn)算符:
(1)算術(shù)運(yùn)算符。
(2)比較(關(guān)系)運(yùn)算符。
(3)賦值運(yùn)算符。
(4)邏輯運(yùn)算符。
(5)位運(yùn)算符。
(6)成員運(yùn)算符。
(7)身份運(yùn)算符。
(8)運(yùn)算符優(yōu)先級(jí)。
這么多,看來(lái)今天可以大開(kāi)眼界了,小萌心里一陣狂喜。
接下來(lái)讓我們一個(gè)一個(gè)學(xué)習(xí)吧!
1.算術(shù)運(yùn)算符
表為算術(shù)運(yùn)算符的描述和實(shí)例。假設(shè)變量a為10,變量b為5。
算術(shù)運(yùn)算符:

下面進(jìn)行實(shí)戰(zhàn)。在交互模式輸入如下:
>>> a=10
>>> b=5
>>> print(a+b)
15
>>> print(a-b)
5
>>> print(a*b)
50
>>> print(a/b)
2.0
>>> print(a**b)
100000
>>> print(9//2)
4
>>> print(9.0//2.0)
4.0
此處的加、減、乘、除,取余、取整除前面都已經(jīng)做過(guò)詳細(xì)介紹,較好理解。但是冪運(yùn)算與數(shù)學(xué)中學(xué)習(xí)的乘方運(yùn)算的形式是不一樣的,是a 2 這樣的形式。有沒(méi)有更好的方式讓人更容易記住這個(gè)符號(hào)呢?
有一個(gè)很好的例子,為什么會(huì)出現(xiàn)32位和64位操作系統(tǒng),并且現(xiàn)在大家都趨向于安裝64位的軟件。先看交互模式下的兩個(gè)輸入:
>>> 2**32/1024/1024/1024
4.0
>>> 2**64/1024/1024/1024
17179869184.0
第一個(gè)輸入,2**32是2的32次方,這是32位操作系統(tǒng)最大支持內(nèi)存的字節(jié)數(shù),除以第一個(gè)1024是轉(zhuǎn)換為KB, 1KB=1024B,除以第二個(gè)1024是轉(zhuǎn)換為MB, 1MB=1024KB,除以第三個(gè)1024是轉(zhuǎn)換為GB, 1GB=1024MB。這個(gè)結(jié)果意味著32位操作系統(tǒng)最大只能支持4GB的內(nèi)存,現(xiàn)在手機(jī)都是4GB標(biāo)配了,電腦4GB怎么夠呢?所以大家都趨向于選擇64位操作系統(tǒng)了,64位操作系統(tǒng)能支持多大內(nèi)存,大家可以自行計(jì)算一下。
2.比較運(yùn)算符
表為比較運(yùn)算符的描述和實(shí)例。以下假設(shè)變量a為10、變量b為20。
比較運(yùn)算符

下面進(jìn)行實(shí)戰(zhàn)。
>>> a=10
>>> b=20
>>> a==b
False
>>> a!=b
True
>>> a>b
False
>>> a<b
True
>>> a>=b
False
>>> a<=b
True
>>> a+10>=b
True
>>> a+10>b
False
>>> a<=b-10
True
>>> a<b-10
False
>>> a==b-10
True
小智:小萌,注意到比較運(yùn)算的特色了嗎?
小萌:比較運(yùn)算只返回True和False兩個(gè)值。
小智:對(duì)的,能看出比較運(yùn)算符兩邊的值和比較的結(jié)果有什么特色嗎,特別是對(duì)于==、<、>、<=、>=這5個(gè)比較運(yùn)算符的結(jié)果?
小萌:讓我仔細(xì)觀察觀察,對(duì)于這些比較運(yùn)算,只要左邊和右邊的操作數(shù)滿足操作符的條件,結(jié)果就是True,不滿足就是False。
小智:你理解的沒(méi)錯(cuò),其實(shí)可以通俗地理解為,比較結(jié)構(gòu)符合大家的心里預(yù)期,結(jié)果就是True,不符合結(jié)果就是False。比如上面的例子中a<b,即10<20,符合大家的預(yù)期,就返回True;對(duì)于a==b,即10==20,大家一眼就能看出這兩者不相等,就返回False。
注意:在一些地方,會(huì)用1代表True、0代表False,這是正確也是合理的表示方式。大家可以理解為開(kāi)和關(guān),就像我們?cè)谖锢碇兴鶎W(xué)的電流的打開(kāi)和關(guān)閉一樣。后面會(huì)有更多地方用1和0代表True和False。
另外,在Python 2中,有時(shí)會(huì)看到<>符號(hào)。和!=一樣,<>也表示不等于,在Python 3中已去除該符號(hào)。若以后看到<>運(yùn)算符,則使用的是Python 2。
3.賦值運(yùn)算符
表為賦值運(yùn)算符的描述和實(shí)例。假設(shè)變量a為10,變量b為20。
賦值運(yùn)算符:

下面進(jìn)行實(shí)戰(zhàn)。
>>> a=10
>>> b=20
>>> c=0
>>> c=a+b
>>> print(c)
30
>>> c+=10
>>> print(c)
40
>>> c-=a
>>> print(c)
30
>>> c*=a
>>> print(c)
300
>>> c/=a
>>> print(c)
30.0
>>> c%=a
>>> print(c)
0.0
>>> c=a**5
>>> print(c)
100000
>>> c//=b
>>> print(b)
20
>>> print(c)
5000
3.位運(yùn)算符
位運(yùn)算符是把數(shù)字看作二進(jìn)制進(jìn)行計(jì)算的。表為Python中位運(yùn)算的描述和實(shí)例。假設(shè)變量a為60,變量b為13。
位運(yùn)算符:

下面進(jìn)行實(shí)戰(zhàn)。
>>> a=60
>>> b=13
>>> c=0
>>> c=a&b
>>> print(c)
12
>>> c=a|b
>>> print(c)
61
>>> c=a^b
>>> print(c)
49
>>> c=~a
>>> print(c)
-61
>>> c=a<<2
>>> print(c)
240
>>> c=a>>2
>>> print(c)
15
4.邏輯運(yùn)算符
Python語(yǔ)言支持邏輯運(yùn)算符。表為邏輯運(yùn)算符的描述和實(shí)例,假設(shè)變量a為10,變量b為20。
邏輯運(yùn)算符:

下面進(jìn)行實(shí)戰(zhàn)。
>>> a=10
>>> b=20
>>> a and b
20
>>> a or b
10
>>> not a
False
>>> not b
False
>>> not -1
False
>>> not False
True
>>> not True
False
5.成員運(yùn)算符
除了之前介紹的運(yùn)算符外,Python還支持成員運(yùn)算符,表為成員運(yùn)算符的描述和實(shí)例。
成員運(yùn)算符:

下面進(jìn)行實(shí)戰(zhàn)。
>>> a=10
>>> b=5
>>> list=[1,2,3,4,5]
>>> print(a in list)
False
>>> print(a not in list)
True
>>> print(b in list)
True
>>> print(b not in list)
False
你可能會(huì)疑惑list是什么,list是一個(gè)集合,此處不做具體講解,后面章節(jié)會(huì)有詳細(xì)介紹。
6.身份運(yùn)算符
身份運(yùn)算符用于比較兩個(gè)對(duì)象的存儲(chǔ)單元,表為身份運(yùn)算符的描述和實(shí)例。
身份運(yùn)算符:

下面進(jìn)行實(shí)戰(zhàn)。
>>> a=10
>>> b=10
>>> print(a is b)
True
>>> print(a is not b)
False
>>> b=20
>>> print(a is b)
False
>>> print(a is not b)
True
注意:后面已對(duì)變量b重新賦值,因而輸出結(jié)果與前面不太一致。
7.運(yùn)算符優(yōu)先級(jí)
表列出了從最高到最低優(yōu)先級(jí)的所有運(yùn)算符。
運(yùn)算符優(yōu)先級(jí):

當(dāng)一個(gè)表達(dá)式中出現(xiàn)多個(gè)操作符時(shí),求值的順序依賴于優(yōu)先級(jí)規(guī)則。Python遵守?cái)?shù)學(xué)操作符的傳統(tǒng)規(guī)則。
小萌,還記得數(shù)學(xué)里面操作符的傳統(tǒng)規(guī)則是怎樣的嗎?
恩,有括號(hào)先算括號(hào)里的,無(wú)論是括號(hào)里還是括號(hào)外的,都是先乘除、后加減。在Python中有更多操作運(yùn)算符,可以使用縮略詞PEMDAS幫助記憶部分規(guī)則。
(1)括號(hào)(Parentheses, P)擁有最高優(yōu)先級(jí),可以強(qiáng)制表達(dá)式按照需要的順序求值,括號(hào)中的表達(dá)式會(huì)優(yōu)先執(zhí)行,也可以利用括號(hào)使得表達(dá)式更加易讀。
例如,對(duì)于一個(gè)表達(dá)式,想要執(zhí)行完加減后再做乘除運(yùn)算,交互模式輸入如下:
>>> a=20
>>> b=15
>>> c=10
>>> d=5
>>> e=0
>>> e=(a-b)*c/d
>>> print('(a-b)*c/d=',e)
(a-b)*c/d= 10.0
順利達(dá)到了我們想要的結(jié)果,如果不加括號(hào)會(huì)怎樣呢?
>>> e=a-b*c/d
>>> print('a-b*c/d=',e)
a-b*c/d= -10.0
結(jié)果與前面完全不同了,這里根據(jù)先乘除后加減進(jìn)行運(yùn)算。如果表達(dá)式比較長(zhǎng),加上括號(hào)就可以使得表達(dá)式更易讀。
>>> e=a+b+c-c*d
>>> print('a+b+c-c*d=',e)
a+b+c-c*d= -5
以上輸入沒(méi)有加括號(hào),表達(dá)式本身沒(méi)有問(wèn)題,但看起來(lái)不太直觀。如果進(jìn)行如下輸入:
>>> e=(a+b+c)-(c*d)
>>> print('(a+b+c)-(c*d)=',e)
(a+b+c)-(c*d)= -5
這樣看起來(lái)就非常直觀。運(yùn)算結(jié)果還是一樣的,但我們一看就能明白該表達(dá)式的執(zhí)行順序是怎樣的。
(2)乘方(Exponentiation, E)操作擁有次高的優(yōu)先級(jí),例如:
>>> 2**1+2
4
>>> 2**(1+2)
8
>>> 2**2*3
12
>>> 2*2**3
16
>>> 2**(2*3)
64
以上結(jié)果解釋:2的一次方為1,加2后結(jié)果為4;1加2等于3,2的3次方結(jié)果為8;2的2次方為4,4乘以3等于12;2的3次方為8,2乘以8等于16;2乘以3等于6,2的6次方為64。
(3)乘法(Multiplication, M)和除法(Division, D)優(yōu)先級(jí)相同,并且高于有相同優(yōu)先級(jí)的加法(Addition, A)和減法(Subtraction, S),例如:
>>> a+b*c-d
165
>>> a*b/c+d
35.0
(4)優(yōu)先級(jí)相同的操作按照自左向右的順序求值(除了乘方外),例如:
>>> a+b-c+d
30
>>> a+b-c-d
20
其他運(yùn)算符的優(yōu)先級(jí)在實(shí)際使用時(shí)可以自行嘗試判斷。若通過(guò)觀察判斷不了,則可以在交互模式下通過(guò)實(shí)驗(yàn)進(jìn)行判斷。