文章目錄
1 算術(shù)運(yùn)算符
2 位運(yùn)算符
3 比較運(yùn)算符
4 賦值運(yùn)算符
5 身份運(yùn)算符
6 成員運(yùn)算符
7 邏輯運(yùn)算符
今天總結(jié)一下Python中七大運(yùn)算符的意義,本文大體是按照運(yùn)算符的優(yōu)先級(jí)排序的,看目錄就知道各個(gè)運(yùn)算符的優(yōu)先級(jí)高低啦~~
1 算術(shù)運(yùn)算符
指數(shù)** 優(yōu)先級(jí)最高,其次是 乘*,除/,取整//,取余%,最后是 加+,減-。
這里重點(diǎn)說下/,//,%,其他運(yùn)算符很簡(jiǎn)單,不用多解釋了吧。
1)一個(gè)斜杠/,除法,兩個(gè)int相除也保留小數(shù)。
3/2 = 1.5
10/3 = 3.3333333333333335
4/2 = 2.0
2)兩個(gè)斜杠//,對(duì)除法結(jié)果向下取整。當(dāng)//兩側(cè)存在浮點(diǎn)型時(shí),結(jié)果取整的基礎(chǔ)上會(huì)保留.0。
3//2 = 1
-3//2 = -2 # 向下取整就是向數(shù)值小的那一方向取整,所以是-2
4//2 = 2
4//2.0 = 2.0
3)百分號(hào)%,取模,返回除法的余數(shù)。%兩側(cè)必須是整數(shù),當(dāng)存在存在負(fù)整數(shù)時(shí),余數(shù)符號(hào)與%右邊的一致。
5%3 = 2
-3%2 = 1
3%(-2) = -1 # 符號(hào)與-2一致,所以是-1
4%2 = 0
4%2.0 = 0.0
2 位運(yùn)算符
按位運(yùn)算符是基于二進(jìn)制來(lái)進(jìn)行計(jì)算的,在二進(jìn)制中 1 為 True,0 為 False:
1)位邏輯運(yùn)算符: 與&,或|,異或^,取反~。
- & :按位與運(yùn)算符,兩個(gè)二進(jìn)制數(shù)相應(yīng)位都為1,則該位的結(jié)果為1,否則為0;
- | :按位或運(yùn)算符,兩個(gè)二進(jìn)制數(shù)相應(yīng)位有一個(gè)為1時(shí),結(jié)果位就為1;
- ^ :異或運(yùn)算符,兩個(gè)二進(jìn)制數(shù)相應(yīng)位相異時(shí),結(jié)果為1;
- ~ :取反運(yùn)算符,對(duì)二進(jìn)制進(jìn)行取反,即 1 取反為 0 ,0 取反為 1。
2)位移運(yùn)算符:左移<< ,右移>> 。
- << 每移動(dòng)一位,相當(dāng)于乘2,
- >> 每移動(dòng)一位,相當(dāng)于除以2,如果不能整除,則向下取整。
看到這里,你也許沒懂位運(yùn)算符這部分到底在說什么……為了把這塊講明白,我會(huì)另外寫一篇文章。篇幅所限,這一次就不深入展開了~
就暫且先知道有這么個(gè)東西,下次填坑 ~
3 比較運(yùn)算符
最基本的: 小于<, 大于>,等于==,小于等于<=,大于等于>=,不等于!=。這些一看就明白,也無(wú)需解釋。
4 賦值運(yùn)算符
1)等于 =,很簡(jiǎn)單了,就是把右邊的值,打上左邊的標(biāo)簽。
2)+=,就是把右邊和左邊的原值相加,把左邊的值更新為相加后的新值。例如 a+=1 就等價(jià)于 a=a+1,但 a=a+1 沒有a+=1 的效率高。
3)同理還有 -=,* =,/=,%=,**=,//=。
5 身份運(yùn)算符
身份運(yùn)算符就是is 和 is not。這里說一下新手容易混淆的is,=,==這三個(gè)的區(qū)別。
1)先說 is 和 ==
- is 比較兩個(gè)對(duì)象的 id 值是否相等,即,是否指向同一個(gè)內(nèi)存地址;
- == 比較的是兩個(gè)對(duì)象的內(nèi)容是否相等,即,值是否相等。
a = "Python"
b = a
b == a
True
id(a)
2974848979888 # a的地址
id(b)
2974848979888 # b的地址和a相同
b is a
True
上面的例子當(dāng)中b和a的內(nèi)存地址是相同的,它們指向同一塊內(nèi)存,因而is 和 == 的結(jié)果都為True,這是因?yàn)橹苯淤x值都是對(duì)值的引用。如果b 和 a 指向了不同的內(nèi)存,那么 b is a 的結(jié)果為False,而 b==a的結(jié)果為True。
a = [1,2,3]
b = [1,2,3]
print(a == b)
True
id(a)
2974887936648
id(b)
2974887936456 # a、b兩個(gè)列表里的元素雖然相同,但是地址不同
print(a is b)
False
最后還有一點(diǎn)要注意,Python僅對(duì)比較小的整數(shù)對(duì)象進(jìn)行緩存(范圍為[-5, 256]),并非是所有整數(shù)對(duì)象。
舉個(gè)例子說明只有小的整數(shù)對(duì)象[-5,256]被放入緩存供重復(fù)使用:
a = 1
b = 1
print(a == b)
True
print(a is b)
True
a = 257
b = 257
print(a == b)
True
print(a is b)
False
但是,這種情況僅在命令行中執(zhí)行才有,當(dāng)在Pycharm或者保存為文件執(zhí)行,結(jié)果就不一樣了,這是因?yàn)榻忉屍髯隽艘徊糠謨?yōu)化。
2)再看 = 和 ==
這兩個(gè)比較好區(qū)分。
- = 的含義是賦值,將某一數(shù)值賦給某個(gè)變量,比如a=3,將3這個(gè)數(shù)值賦予給a;
- == 是判斷是否相等,返回True 或 False。比如1 == 1,他們是相等的,就返回True;1==2,他們是不相等的,那么就返回False。
a = [1,2]
b = [1,2]
c = a
print(a == b)
True
print(a is b)
False
print(a is c)
True
3)!= 和 is not
- 雙等號(hào) == 和不等號(hào) != 判斷是否相等;
- is 和 is no t判斷是否是同一個(gè)對(duì)象。
a = [1,2,3]
b = [1,2,3]
print(a == b)
True
print(a != b)
False
print(a is b)
False
print(a is not b)
True
6 成員運(yùn)算符
in 和 not in,用于判斷元素是否在當(dāng)前對(duì)象中
print('ab' in 'abc')
True
print(a in ['a','b','c'])
False
print('a' in ['a','b','c'])
True
print(['a','b'] in ['a','b','c'])
False
print(['a','b'] not in ['a','b','c'])
True
7 邏輯運(yùn)算符
優(yōu)先級(jí):not > and > or。
- and 兩側(cè)都是True則返回True,否則返回False;
- or 兩側(cè)都是False則返回False,否則返回True。
短路現(xiàn)象:
- and 前面的表達(dá)式為False,則后面的表達(dá)式不執(zhí)行;
- or 前面的表達(dá)式為True,則后面的表達(dá)式不執(zhí)行。
print(1 > 2 and 3 < 2 or not 4 > 5)
True
拆解一下上面的例子,1 > 2 and 3 < 2 or not 4 > 5。
- 因?yàn)楸容^運(yùn)算符優(yōu)先級(jí)高于邏輯運(yùn)算符,所以第一步轉(zhuǎn)化成 False and False or not False;
- 因?yàn)?not 優(yōu)先級(jí)大于 and,所以轉(zhuǎn)化成 False and False or True;
- 因?yàn)?and 優(yōu)先級(jí)大于 or,所以轉(zhuǎn)化成 False or True;
- 最后結(jié)果是True。