一、運算符
運算符(Operators,也翻譯為操作符),是發(fā)起運算的最簡單形式。
運算符的分類各有不同,我們就把運算符進行如下分類:
? 數(shù)學(算術)運算符(Arithmetic operators)
? 比較運算符(Comparison operators)
? 賦值運算符(Assignment operators)
? 邏輯運算符(Logical operators)
? 按位運算符(Bitwise operators)
? 成員運算符(Member operators)
? 身份運算符(Identity operators)
? 條件 (三元) 運算符(Conditional operator)
1. 數(shù)學運算符
加+ 減- 乘 * 除/ 取余// 取模% 冪乘 **
(Python浮點數(shù)的運算其包含的小數(shù)位數(shù)是不確定的,可能會影響結果)
+求兩個數(shù)字和 2 + 3 ==>5
-求兩個數(shù)字差 2 - 3 ==> -1
*求兩個數(shù)字積 2 * 3 ==> 6
/求兩個數(shù)字除 4 / 2 ==> 2
//求余,向下取接近除數(shù)的整數(shù) 10 // 3 ==> 3
%求兩個數(shù)字的余數(shù) 10 % 3 ==> 1
**冪乘 2 * 3 ==> 8
2. 比較(關系)運算符:結果返回布爾值(True或False)
大于> 小于< 大于等于>= 小于等于<= 等于==(判斷值和類型是否相等) 不等于!=
# 數(shù)字與數(shù)字比較
5 > 4 # out: True
5 <= 2 # out: False
5 == 1 # out: False
# 字符串與字符串比較(比較ASCII碼值)
"5" > "6" # out: False
"A" < "f" # out: True
# 先比較第一個字符的ASCII碼值,若相同則比較下一個字符,否則返回布爾值
"db" > "cb" # out: True
# 多層判斷,具有惰性求值或者邏輯短路的特點
1 > 6 < math.sqrt(9) # out: False
3.賦值運算符
| 運算符 | 描述 |
|---|---|
| = | 賦值運算符 |
| += | 加法賦值運算符,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 |
| **= | 冪賦值運算符,a **= b等價于a = a ** b |
a, b= 20, 10
a += b # out: 30
a -= b # out: 20
a *= b # out: 200
a /= b # out: 20.0
a //= 2 # out: 10.0
# !?。∽⒁鈇的值已經改變
a = 10 # out: 10
a %= 4 # out: 2
a **= 2 # out: 4
4. 邏輯運算符
特點:惰性求值或邏輯短路
優(yōu)先級:not > and > or
| 運算符 | 描述 |
|---|---|
| and | 布爾與,and兩端都為True則為True,否則為False |
| or | 布爾或,or兩端只要有一個為True則為True,否則為False |
| not | 布爾非,若x為True,返回False。若x為False,則返回True(返回結果只能是True或者False之一) |
'''and: 遇假則停'''
4>6 and 8>3 # out: 3>5的值為False,不需要計算后面表達式
1<2 and 7>3 # out: 3<5的值為True,所以需要計算后面表達式
'''or: 遇真則停'''
3>5 or a>3 # out: 3>5的值為False,所以需要計算后面表達式
3<5 or a>3 # out: 3<5的值為True,不需要計算后面表達式
# 正確的執(zhí)行順序為:True or (True and False)
True or True and False #out: True
# 正確的執(zhí)行順序為:not (not (True or (False and (not True))))
not not True or False and not True # out: True
5.位運算符
| 運算符 | 描述 |
|---|---|
| & | 按位與運算符,參與運算的兩個值,若相應位都為1,則該位的結果為1,否則為0 |
| | | 按位或運算符,只要對應的兩個二進制值有一個為1時,結果就為1;全為0則為0 |
| ~ | 按位取反運算符,對數(shù)據的每個二進制取反,即把1變0,0變1,最后結果再進行取反,即~n = -(n+1) |
| ^ | 按位異或運算符,當兩對應的二進制相應位不相同時,則該位的結果為1 |
| << | 左移運算符,運算符的各二進制位全部左移若干位,高位丟棄,低位補0 |
| >> | 右移運算符,運算符的各二進制位全部右移若干位,高位補0,低位丟棄 |
3 & 2 # 3二進制為011,2二進制為010,按位與后為010,轉換為十進制就是2
3 | 2 # 3二進制為011,2二進制為010,按位或后為011,轉換為十進制就是3
3 ^ 2 # 3二進制為011,2二進制為010,按位異或后為001,轉換為十進制就是1
~3 # 3二進制為011,按位取反后為100,轉換為十進制就是4,結果為-4
8 << 2 # 8二進制為1000,左移兩位為100000(末尾補2個0),轉換為十進制就是32
8 >> 2 # 8二進制為1000,左移兩位為0010(高位補2個0),轉換為十進制就是2
6.成員運算符
| 運算符 | 描述 |
|---|---|
| in | 若在指定序列中找到指定值返回True,否則返回False |
| not in | 若在指定序列中沒有找到指定值返回False,否則返回True |
3 in (1,2,3) # out: True
4 in (1,2,3) # out: False
5 in range(1, 10) # out: True
'a' in 'python' # out: False
'abc' in 'abcdefg' # out: True
7.身份運算符
| 運算符 | 描述 |
|---|---|
| is | 若兩個標識符引用自一個對象返回True,否則返回False |
| is not | 若兩個標識符引用自不同對象返回True,否則返回False |
a, b, c = 5, 3, 5
a is b # out: False
a is c # out: True
b is c # out: False
a is not b # out: True
a is not c # out: False
#如果兩個對象是同一個,二者具有相同的內存地址
x = [1, 2, 3]
y = [1, 2, 3]
x is y # out: False
x[0] is y[0] # out: True
8.三目運算符
①三目的表達式及簡單使用
首先,我們可以看以下例子:
'''正常邏輯寫法'''
if a>b:
max = a;
else:
max = b;
'''三目運算簡便寫法'''
max = a if a>b else b
Python中的三目運算不像其他編程語言中三目運算符判斷條件 ? 條件為真執(zhí)行的代碼 : 為假執(zhí)行的代碼的寫法,而是使用已有的 if else 關鍵字來實現(xiàn)相同的功能。
在Python中三目的表達式格式如下:exp1(True) if condition else exp2(False)
condition 是判斷條件,exp1 和 exp2 是兩個表達式。若 condition 成立(結果為真),就執(zhí)行 exp1,并把 exp1 的結果作為整個表達式的結果;如果 condition 不成立(結果為假),就執(zhí)行 exp2,并把 exp2 的結果作為整個表達式的結果。
max = a if a>b else b
'''
那么上述例子我們就可以很好的理解它的意思:
如果 a>b 成立,就把 a 作為整個表達式的值,并賦給變量 max;
如果 a> b 不成立,就把 b 作為整個表達式的值,并賦給變量 max。
'''
②三目運算符的嵌套用法
Python 三目運算符支持嵌套,因此可以構成更加復雜的表達式。在嵌套時需要注意 if 和 else 的配對,例如:
a if a>b else c if c>d else d
# 上述表達式應該理解為:a if a>b else ( c if c>d else d )
# 實例:判斷兩個數(shù)字的關系
a = int( input("Input a: ") )
b = int( input("Input b: ") )
print("a大于b") if a>b else ( print("a小于b") if a<b else print("a等于b") )
#輸入a: Input a: 45
#輸入b: Input b: 100
#得到以下結果: a小于b
'''
該程序是一個嵌套的三目運算符。程序先對 a>b 求值,
如果該表達式為 True,程序就返回執(zhí)行第一個表達式 print("a大于b"),
否則將繼續(xù)執(zhí)行 else 后面的內容,也就是:
( print("a小于b") if a<b else print("a等于b") )
進入該表達式后,先判斷 a<b 是否成立,
如果 a<b 的結果為 True,將執(zhí)行 print("a小于b"),否則執(zhí)行 print("a等于b")。
'''
二、運算符優(yōu)先級
Python運算符優(yōu)先級:
優(yōu)先級順序: 依次降低
| 運算符 | 說明 | 優(yōu)先級 | 結合性 |
|---|---|---|---|
| ( ) | 小括號 | 19 | 無 |
| x[i] 或 x[ i1: i2 [:i3] ] | 索引運算符 | 18 | 左 |
| x.attribute | 屬性訪問 | 17 | 左 |
| ** | 乘方 | 16 | 左 |
| ~ | 按位取反 | 15 | 右 |
| +(正號)、- (負號) | 符號運算符 | 14 | 右 |
| *、/、%、// | 乘除 | 13 | 左 |
| +、- | 加減 | 12 | 左 |
| >>、<< | 位移 | 11 | 左 |
| & | 按位與 | 10 | 右 |
| ^ | 按位異或 | 9 | 左 |
| | | 按位或 | 8 | 左 |
| ==、!=、>、>= 、<、<= | 比較運算符 | 7 | 左 |
| is、is not | is身份運算符 | 6 | 左 |
| in、not in | in成員運算符 | 5 | 左 |
| not | 邏輯非 | 4 | 右 |
| and | 邏輯與 | 3 | 左 |
| or | 邏輯或 | 2 | 左 |
exp1,exp2 |
逗號運算符 | 1 | 左 |
Python 運算符的結合性
結合性:就是當一個表達式中出現(xiàn)多個優(yōu)先級相同的運算符時,先執(zhí)行哪個運算符(先執(zhí)行左邊的叫左結合性,先執(zhí)行右邊的叫右結合性)
100 / 25 * 16 # 64
'''
其中"/"和"*"的優(yōu)先級相同,這個時候就不能只依賴運算符優(yōu)先級決定了,需要參考運算符的結合性。
`/`和`*`都具有左結合性,因此先執(zhí)行左邊的除法,再執(zhí)行右邊的乘法,最終結果是 64。
'''
總結:
當一個表達式中出現(xiàn)多個運算符時,Python 會先比較各個運算符的優(yōu)先級,按照優(yōu)先級從高到低的順序依次執(zhí)行;當遇到優(yōu)先級相同的運算符時,再根據結合性決定先執(zhí)行哪個運算符:如果是左結合性就先執(zhí)行左邊的運算符,如果是右結合性就先執(zhí)行右邊的運算符。