一、簡介
Python中運算符分為:
- 算術運算符:主要用於兩個對象算數計算(加減乘除等運算)
- 比較(關系)運算符:用於兩個對象比較(判斷是否相等、大於等運算)
- 賦值運算符:用於對象的賦值,將運算符右邊的值(或計算結果)賦給運算符左邊。
- 邏輯運算符:用於邏輯運算(與或非等)。
- 位運算符: 對Python對象進行按照存儲的bit操作。
- 成員運算符:判斷一個對象是否包含另一個對象。
- 身份運算符:判斷是不是引用自一個對象
二、運算符詳解
2.1、算術運算符
算數運算符 |
描述 |
實例 |
+ |
加 - 兩個對象相加 |
假設變量: a=10,b=20,a + b 輸出結果 30 >>> a = 10 >>> b = 15 >>> a + b 25 >>> a = 'ni' >>> b = 'hao' >>> a + b 'nihao' |
- |
減 - 得到負數或是一個數減去另一個數 |
假設變量: a=10,b=20,a - b 輸出結果 -10 >>> a = 10 >>> b = 3 >>> a - b 7 |
* |
乘 - 兩個數相乘或是返回一個被重復若干次的字符串 |
假設變量: a=10,b=20,a * b 輸出結果 200 >>> a = 2 >>> b = 10 >>> a * b 20 |
/ |
除 - x除以y |
假設變量: a=10,b=20,b / a 輸出結果 2 >>> a = 2 >>> b = 10 >>> b / a 5.0 |
% |
取模 - 返回除法的余數 |
假設變量: a=10,b=20,b % a 輸出結果 0 >>> a = 2 >>> b = 10 >>> b % a 0 |
** |
冪 - 返回x的y次冪 |
假設變量: a=10,b=20,a**b 為10的20次方, 輸出結果 100000000000000000000 >>> a = 2 >>> b = 10 >>> a ** b 1024 |
// |
取整除 - 返回商的整數部分 |
假設變量: a=10,b=20,9//2 輸出結果 4 , 9.0//2.0 輸出結果 4.0 >>> a = 2 >>> b = 10 >>> b // a 5 |
2.2、比較(關系)運算符
比較運算符 |
描述 |
實例 |
== |
等於 - 比較對象是否相等 |
假設變量: a=10,b=20,(a == b) 返回 False。 >>> a = 2 >>> b = 10 >>> a == b False |
!= |
不等於 - 比較兩個對象是否不相等 |
假設變量: a=10,b=20,(a != b) 返回 true. >>> a = 2 >>> b = 10 >>> a != b True |
<> |
不等於 - 比較兩個對象是否不相等 |
Python3.6中沒有這個操作符 |
> |
大於 - 返回x是否大於y |
假設變量: a=10,b=20,(a > b) 返回 False。 >>> a = 2 >>> b = 10 >>> a > b False |
< |
小於 - 返回x是否小於y。所有比較運算符返回1表示真,返回0表示假。這分別與特殊的變量True和False等價。注意,這些變量名的大寫。 |
假設變量: a=10,b=20,(a < b) 返回 true。 >>> a = 2 >>> b = 10 >>> a < b True |
>= |
大於等於 - 返回x是否大於等於y。 |
假設變量: a=10,b=20,(a >= b) 返回 False。 >>> a = 10 >>> b = 10 >>> a >= b True |
<= |
小於等於 - 返回x是否小於等於y。 |
假設變量: a=10,b=20,(a <= b) 返回 true。 >>> a = 10 >>> b = 10 >>> a <= b True |
2.3、賦值運算符
賦值運算符 |
描述 |
實例 |
= |
簡單的賦值運算符 |
假設變量: a=10,b=20,c = a + b 將 a + b 的運算結果賦值為 c >>> a = 10 >>> a 10 >>> a = 10 + 5 >>> a 15 |
+= |
加法賦值運算符 |
假設變量: a=10,b=20,c += a 等效於 c = c + a >>> a = 0 >>> a += 1 >>> a 1 >>> a += 10 >>> a 11 >>> a = 'a' >>> a += 'b' >>> a 'ab' |
-= |
減法賦值運算符 |
假設變量: a=10,b=20,c -= a 等效於 c = c - a >>> a = 10 >>> a -= 1 >>> a 9 |
*= |
乘法賦值運算符 |
假設變量: a=10,b=20,c *= a 等效於 c = c * a >>> a = 2 >>> a *= 10 >>> a 20 >>> a = 'z' >>> a *= 5 >>> a 'zzzzz' |
/= |
除法賦值運算符 |
假設變量: a=10,b=20,c /= a 等效於 c = c / a >>> a = 10 >>> a /= 2 >>> a 5.0 |
%= |
取模賦值運算符 |
c %= a 等效於 c = c % a >>> a = 10 >>> a %= 3 >>> a 1 |
**= |
冪賦值運算符 |
c **= a 等效於 c = c ** a >>> a = 2 >>> a **= 10 >>> a 1024 |
//= |
取整除賦值運算符 |
c //= a 等效於 c = c // a >>> a = 11 >>> a //= 2 >>> a 5 |
2.4、邏輯運算符
邏輯運算符 |
邏輯表達式 |
描述 |
實例 |
and |
x and y |
布爾"與" - 如果 x 為 False,x and y 返回 False,否則它返回 y 的計算值。 >>> a = 0 >>> b = 1 >>> a and b 0 >>> a = 'a' >>> a and b 1 |
(a and b) 返回 20。 |
or |
x or y |
布爾"或" - 如果 x 是非 0,它返回 x 的值,否則它返回 y 的計算值。 >>> a = 0 >>> b = 1 >>> a or b 1 |
(a or b) 返回 10。 |
not |
not x |
布爾"非" - 如果 x 為 True,返回 False 。如果 x 為 False,它返回 True。 >>> a = 0 >>> not a True |
not(a and b) 返回 False |
2.5、位運算符
位運算符 |
描述 |
實例 |
& |
按位與運算符:參與運算的兩個值,如果兩個相應位都為1,則該位的結果為1,否則為0 |
(a & b) 輸出結果 12 ,二進制解釋: 0000 1100 >>> a=1 >>> b=2 >>> a&b 0 >>> b=3 >>> a&b 1 |
| |
按位或運算符:只要對應的二個二進位有一個為1時,結果位就為1。 |
(a | b) 輸出結果 61 ,二進制解釋: 0011 1101 >>> a = 1 >>> b = 2 >>> a|b 3 |
^ |
按位異或運算符:當兩對應的二進位相異時,結果為1 |
(a ^ b) 輸出結果 49 ,二進制解釋: 0011 0001 >>> a = 1 >>> b = 3 >>> a^b 2 |
~ |
按位取反運算符:對數據的每個二進制位取反,即把1變為0,把0變為1 |
(~a ) 輸出結果 -61 ,二進制解釋: 1100 0011, 在一個有符號二進制數的補碼形式。 >>> a = 0 >>> ~a -1 >>> a = 1 >>> ~a -2 |
<< |
左移動運算符:運算數的各二進位全部左移若干位,由"<<"右邊的數指定移動的位數,高位丟棄,低位補0。 |
a=2,a << 2 輸出結果 8 ,二進制解釋: 0000 0010向右移兩位,0000 0100。 >>> a = 2 >>> a << 2 8 |
>> |
右移動運算符:把">>"左邊的運算數的各二進位全部右移若干位,">>"右邊的數指定移動的位數 |
a >> 2 輸出結果 15 ,二進制解釋: 0000 1111 >>> a = 16 >>> a >> 1 8 |
2.6、成員運算符
成員運算符 |
描述 |
實例 |
in |
如果在指定的序列中找到值返回 True,否則返回 False。 |
x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 >>> a = 'a' >>> b = 'cba' >>> a in b True >>> b = list(b) >>> b ['c', 'b', 'a'] >>> a in b True |
not in |
如果在指定的序列中沒有找到值返回 True,否則返回 False。 |
x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。 >>> a = 'a' >>> b = 'cba' >>> a not in b False >>> b = list(b) >>> b ['c', 'b', 'a'] >>> a not in b False
|
2.7、身份運算符
身份運算符 |
描述 |
實例 |
is |
is是判斷兩個標識符是不是引用自一個對象 |
x is y, 如果 id(x) 等於 id(y) , is 返回結果 1 >>> a = 'a' >>> b = 'b' >>> a is b False >>> b = 'a' >>> a is b True >>> id(a) 2422111596248 >>> id(b) 2422111596248 |
is not |
is not是判斷兩個標識符是不是引用自不同對象 |
x is not y, 如果 id(x) 不等於 id(y). is not 返回結果 1 >>> a = 'a' >>> b = 'b' >>> a is not b True >>> b = 'a' >>> a is b False >>> id(a) 2422111596248 >>> id(b) 2422111596248 |
三、重要運算符說明
3.1、join和符號”+“區別
建議:字符串拼接操作盡量多用join,而減少用”+“
join操作時會先計算字符操作所用到的空間總和大小,然后申請內存。然后進行字符串連接操作。所以join的時間復雜的近似O(n)。
+操作符連接操作符時,由於字符串是不可變對象,所以多個字符串拼接操作時從前向后的依此計算,用前一次的計算結果再和下一個字符串拼接。所以每次操作都需要申請一塊新的內存。舉例:S1+S2+S3+…Sn,實際過程是:1、先申請一塊內存;2、將S1、S2復制到這塊內存中(這樣這塊內存就是S1+S2);3、繼續第一步申請內存;4、繼續把第二步的內存內容和S3復制到第三步申請的內存。然后重復第一步到第二步至計算到Sn。所以操作符”+“的時間復雜的近似O(n^2)
對於不同個數字符串拼接操作時join和+所用時間對比(python2.7環境運行結果):
鏈接字符串數量 |
join操作消耗時間 |
+操作消耗時間 |
3 |
0.011083841323852539 |
0.02231597900390625 |
10 |
0.014094829559326172 |
0.05936312675476074 |
100 |
0.1445930004119873 |
0.6129770278930664 |
1000 |
1.340691089630127 |
6.07816481590271 |
10000 |
13.942554950714111 |
61.60126209259033 |
參考計算運算上面時間的代碼:
#!/usr/bin/env python # -*- coding: utf-8 -*- import timeit strlist = ["it is a value string will not keep in memorty" for n in range(100000)] def join_test(): return ''.join(strlist) def plus_test(): result = '' for i,v in enumerate(strlist): result = result + v return result if __name__ == '__main__': x = [3,10,100,1000,10000] jointd = {3:0,10:0,100:0,1000:0,10000:0} plustd = {3:0,10:0,100:0,1000:0,10000:0} for i in x: jointimer = timeit.Timer("join_test()","from __main__ import join_test") jointd[i] = jointimer.timeit(number=i) plustimer = timeit.Timer("plus_test()","from __main__ import plus_test") plustd[i] = plustimer.timeit(number=i) print ('join use time:\n',jointd) print ('plus use time:\n', plustd)
3.2、is和”==“區別
區別:
is是比較對象是否相同(is表示對象標識符即object identity),即用id()函數查看的地址是否相同,如果相同則返回True,如果不同則返回False。is不能被重載。
”==“是比較兩個對象的值是否相等,此操作符內部調用的是”__eq__()“方法。所以a==b等效於a.__eq__(b),所以”==“可以被重載。