說完常用的資料類型,再來說下運算符。運算符用于将各種類型的資料進行運算,讓靜态的資料跑起來。
程式設計語言中的運算大緻分為以下幾個大類:
- 算術運算, 用于加減乘除等數學運算
- 指派運算,用于接收運算符或方法調用傳回的結果
- 比較運算, 用于做大小或等值比較運算
- 邏輯運算,用于做 與、或、非運算
- 位運算, 用于二進制運算
每種運算中所包含的符号稱為相應的運算符,如 算術運算符、比較運算符等。
一、算術運算
運算(符) | 說明 | 執行個體 |
---|---|---|
+ | 兩個對象相加 | 2 + 3 結果為 5 |
- | 兩個對象相減 | 3 - 2 結果為 1 |
* | 兩個數相乘或傳回一個重複若幹次的序列 | 2 * 3 結果為 6; 'abc' * 2 結果為 'abcabc' |
/ | 兩個數相除 | 3 / 2 結果為 1.5 |
// | 整除,傳回商的整數部分 | 3 // 2 結果為 1,3 // 2.0 結果為 1.0 |
% | 求餘/取模,傳回除法的餘數 | 3 % 2 結果為 1,3 % 2.0 結果為 1.0 |
** | 求幂/次方 | 2 ** 3 結果為 8 |
二、指派運算
描述 | ||
---|---|---|
= | 簡單指派運算符 | a = 5, b = 3, c = a - b |
+= | 加法指派運算符 | a += b 相當于 a = a + b |
-= | 減法指派運算符 | a -= b 相當于 a = a -b |
*= | 乘法指派運算符 | a = b 相當于 a = a b |
/= | 除法指派運算符 | a /= b 相當于 a = a / b |
//= | 取整除指派運算符 | a //= b 相當于 a = a // b |
%= | 取模指派運算符 | a %= b 相當于 a = a % b |
**= | 幂指派運算符符 |
三、比較運算
Python有8中比較操作,它們具有相同的優先級。比較操作可以被任意連接配接,比如 x< y <= z 等同于 x < y and y <= z,隻是第一種形式下的y隻被評估一次。另外,當 x < y不成立時,這兩種形式下的z都不會被評估。
< | 嚴格小于 | 3 < 5 結果為True,5 < 5 結果為False |
<= | 小于或等于 | 3 <= 5 結果為True,5 <= 5 結果為True |
> | 嚴格大于 | 5 > 3 結果為True,5 > 5 結果為False |
>= | 大于或等于 | 5 >= 3 結果為True,5 >= 5 結果為True |
== | 等于 | 1 == 1.0 == True 結果為True |
!= | 不等于 | |
is | 判斷兩個辨別符是否引用自一個對象 | x is y, 如果id(x) == id(y),即x也y的指向同一個記憶體位址,則結果為1,否則結果為0 |
is not | 判斷兩個辨別符是否引用自不同對象 | x is not y, 如果id(x) != id(y),即x和y指向不同的記憶體位址,則結果為1,否則結果為0 |
說明:
a) 不同類型的對象進行比較,從來不會相等(不同的數字類型除外);
b) 當把<、<=、> 和 >=操作符在這幾種情況下會抛出TypeError異常: (1) 用于複數和另外的内置數字類型進行比較時;(2) 比較的對象為不同類型,無法進行比較時;(3) 未定義的其他情況下;
c) 一個類的不同執行個體通常是不相等的,除非該類定義了__eq__()方法;
d) 一個類的執行個體不能相對于同一類或其他類的的其他執行個體進行排序,除非該類定義了足夠的方法__lt__(), __le__(), __gt__(), __ge__()。如果想要比較運算符的正常含義, __lt__()和__eq__()就足夠了;
e) is 和 is not操作符的行為是不能自定義的;另外,它們可以被應用到兩個不同類型的對象,不會已發異常。
f) 另外兩個具有相同句法優先級的操作是 in 和 not in,它們支援序列、集合和映射類型的對象。
g) 比較運算的結果為布爾值:True 或 False
四、邏輯運算
“真”值測試(Truth Value Testing)
在講解“布爾運算”之前,我們先來說下Python中的一個特殊操作--“真”值測試。
Python中的任何一個對象都可以被測試“真”值。這裡說的“真”值測試可以這樣了解:Python中的任何一個對象都可以轉換為一個布爾值,而這個“真”值測試就是擷取一個對象對應的布爾值的過程。
Python中隻有下面這些值對應的布爾值為False:
- None
- False
- 數字類型中的0,如:0, 0.0, 0j
- 任意空序列,如:'', (), []
- 任意一個空映射,如:{}
- 一個使用者自定義類的執行個體--該使用者自定義類中定義了一個__bool__()或__len__()方法,且執行個體調用該方法時傳回整數0或布爾值False
除此之外,所有的其它值對應的布爾值都是True, 是以許多類型的對象永遠是True。
"真"值測試可以被用在 if或while條件中,也可以作為布爾操作的操作數。
布爾運算(Boolean Operations)
Python中的邏輯運算稱為“布爾運算(Boolean Operations)”,操作符包括:and(與)、or(或)、not(非)。
下面按照他們的優先級升序順序進行說明:
運算 | 結果 |
---|---|
x or y | 如果x的Truth值測試結果為False,那麼該操作的結果為y的值,否則為x的值 |
x and y | 如果x的Truth值測試結果為False, 那麼該操作的結果為x的值,否則為y的值 |
not x | 如果x的Truth值測試結果為False, 那麼該操作的結果為True,否則結果為False |
a)or是一個短路操作符,也就是說,隻有第一個參數的評估結果為False時,第二個參數才會被評估;
b) and也是一個短路操作符,也就是說,隻有第一個參數的評估結果為True時,第二個參數才會被評估;
c) not操作符比非布爾操作符優先級低,是以,not a == b 被解釋為 not (a == b);如果寫成 a == not b會包文法錯誤。
五、位運算
按位運算是指把數字轉換為二進制來進行計算,位運算符包括以下幾種:
假設:
運算符 | ||
---|---|---|
& | 按位與:參與運算的兩個值,如果相應的二進制位都為1,則該位結果為1,否則為0 | a & b 對應的二進制結果為 0000 1100,十進制為12 |
豎杠 | 按位或:參與運算的兩個值,隻要對應的二進制位由一個為1時,該位結果就為1 | a 豎杠 b 對應的二進制結果為 0011 1101,十進制為61 |
^ | 按位異或:參與運算的兩個值,當對應的二進制位不同時,該為結果為1,否則改為結果為0 | a ^ b 對應的二進制結果為 0011 0001, 十進制為49 |
~ | 按位取反:這個是單目運算符,隻有一個值參與運算,運算過程是對每個二進制位取反,即把1變0,把0變1 | ~a 的二進制結果為 1100 0011,十進制數為-61 |
<< | 左移運算符:運算數的各二進制位全部左移若幹位,高位丢棄,低位補0,結果相當于運算數乘以2的n次方,正負符号不發生改變 | a << 2 的二進制結果為 1111 0000,十進制數為240 |
>> | 右移運算符:運算數的各二進制位全部右移若幹位,結果相當于運算數除以2的n次方,正負符号不發生改變 | a >> 2 的二進制結果為 0000 1111,十進制為15 |