part2-3:Python 運算符(賦值、算術、位運算、索引、比較、邏輯、三目、in、運算符優先級)



運算符是一種特殊符號,用來表示數據運算、賦值和比較等。運算符將一個或多個操作數連接成可執行語句,用來實現特定功能。Python 中運算符分為如下幾種:
(1)、賦值運算符
(2)、算術運算符
(3)、位運算符
(4)、索引運算符
(5)、比較運算符
(6)、邏輯運算符


一、 賦值運算符

Python中“=”是賦值運算符,用於為變量或常量指定值。可將表達式的值賦值給另一個變量。例如:
s1 = 'python' # 將字符串賦值給 s1 變量
flags = True # 為變量 flags 賦值為 True

還可以使用賦值運算符將一個變量的值賦值給另一個變量。例如:
s2 = s1 # 將變量 s1 的值賦值給 s2

Python 的賦值表達式是有值的,賦值表達式的值就是被賦的值,因此還可以進行連續賦值,例如:
x = y = z = 30
這里將 z = 30 表達式的值賦給變量 y,是由於賦值表達式本身也有值,就是被賦的值,因此表達式 z=30 的值是 30,所以 y 也被賦值為 30;以此類推,變量 x 也被賦值為 30。

賦值運算還可以將表達式的值賦給變量,例如:
n1 = 1.23
n2 = n1 + 3 # 將表達式的值賦值給 n2

二、 算術運算符

算術運算符用於執行基本的數學運算,如加、減、乘、除和求余等。
+:加法運算符除可以讓數字相加外,還可以作為字符串和序列的連接運算符。示例如下:
x = 1.1
y = 2.2
z = x + y # z 的值是 3.3
s1 = 'hello, ' + 'michael' # 使用 + 連接兩個字符串

-:減法運算符可讓兩個數字相減,還可以作為求負運算符。示例如下:
a = 5.3
b = 3.1
c = a - b # c 的值是 2.2
a = -a # 對 a 求負,此時 a 的值是 -5.3

*:乘法運算符可讓兩個數字相乘。還可作為字符串或序列的連接運算符,表示將 N 個字符串連接起來。示例如下:
multiply = 5 * 3.14 # 兩個數字相乘
print("hello," * 5) # 使用 乘法(*) 將字符串連接起來,輸出:hello,hello,hello,hello,hello,

/或//:除法運算符有兩個:“/” 是普通除法,除不盡時產生小數;“//”是整除,結果只有商的整數部分,小數部分被丟棄。示例如下:
print(20/6) # 普通除法,輸出是:3.3333333333333335
print(20//6) # 整除法,輸出是:3

在Python中的除法運算,除數不能為0,否則報 ZeroDivisionError錯誤。在Python2 中只有一個“/”除法運算符。當兩個操作數都是
整數時就是整除,其中有一個是浮點數時,就是非整除運算。

%:求余運算符,求余運算符的兩個操作數可以是整數,也可以是小數。求余的結果不一定是整數,它是第一個操作數除以第二個操作數,
得到一個整除的結果后剩下的值就是余數
。求余運算的第二個操作數同樣不能為0,否則報 ZeroDivisionError錯誤。示例如下:
print(7%5) # 整數求余,輸出是:2
print(7.3%5.1) # 浮點數取余,輸出是:2.2
print(-7.3%-5.1) # 浮點數取余,輸出是:-2.2
print(7.3%-5.1) # 第二個操作數為負數,輸出是:-2.8999999999999995
print(7.3%-2.3) # 第二個操作數為負數,輸出是:-1.8999999999999995
print(-7.3%2.3) # 第一個操作數為負數,輸出是:1.8999999999999995
print(7%0) # 第二個操作數不能為0,報 ZeroDivisionError錯誤

在上面的示例中,第四個算式的計算結果為什么不是 -2.9?在Python中求余運算的邏輯是用被除數減去除數的N倍,這里N是 -2,所以得到的結果應該是-2.9。但實際結果是-2.8999999999999995,這是由於浮點數在存儲機制導致的。計算機底層的浮點數的存儲機制並不是精確保存每一個浮點數的值,浮點數在Python中可能產生精度丟失的問題。比如這里正常的計算結果是-2.9,但實際計算的結果是一個非常接近-2.9的值。

**:乘方運算符。一個方便的運算符,開方運算是乘方運算的逆運算,用“**”可以進行開方運算。示例如下:
print(3**3) # 3的3次方,輸出是:27
print(3**(1/2)) # 3的平方根,輸出是:1.7320508075688772
print(2**(1/2)) # 2的平方根,輸出是:1.4142135623730951

三、 位運算符

位運算常用在圖形、圖像處理,和創建設備驅動等底層開發中使用。使用位運算可以直接操作數值的原始bit位,在使用自定義的協議進行通信時,使用位運算符對原始數據進行編碼和解碼了非常有效。

Python中位運算符有下面6個:
&:按位與,需要2個操作數
|:按位或,需要2個操作數
^:按位異或,需要2個操作數
~:按位取反,需1個操作數
<<:左位移運算符,需要2個操作數
>>:右位移運算符,需要2個操作數

示例如下,下面示例中省略了前面24個0:
print(3 & 6) # 00000011 & 00000110 = 00000010,輸出:2
print(3 | 6) # 00000011 | 00000110 = 00000111,輸出:7
print(~5) # 正數5按位取反,輸出是:-6
print(~-5) # 負數5按位取反,輸出是:4

正數的原碼、反碼、補碼都是相同的。負數的原碼最高位表示符號位,取反碼時符號位保持不變,反碼加1得到補碼。
-5的原碼:1000 0000 0000 0000 0000 0000 0000 0101 # 最高位1是符號位
-5的反碼:1111 1111 1111 1111 1111 1111 1111 1010 # 反碼是原碼按位取反,符號位保持不變
-5的補碼:1111 1111 1111 1111 1111 1111 1111 1011 # 反碼加1得到補碼
4的原碼:0000 0000 0000 0000 0000 0000 0000 0100 # 對-5的補碼按位取反就得到正的二進制數,可直接計算結果,即4的原碼

5原碼: 0000 0000 0000 0000 0000 0000 0000 0101 # 正數的原碼
~5的結果:1111 1111 1111 1111 1111 1111 1111 1010 # 按位取反后最高位符號位是負數,得到的是負二進制數
計算反碼: 1000 0000 0000 0000 0000 0000 0000 0101 # 對負二進制數按位取反得到反碼,符號位保持不變
得到補碼: 1000 0000 0000 0000 0000 0000 0000 0110 # 反碼加1得到補碼,用補碼直接計算結果得 -6

取反小結:
(1)、取反后正數變負數,負數變正數。
(2)、取反后,如果結果為負數,要計算它的補碼,根據補碼得到最后的十進制結果。
(3)、取反后,如果為正數,則其原碼、反碼、補碼一樣,可以直接計算出十進制結果。
(4)、整數的取反運算等於該整數加1后,再對結果取負數運算,用公式總結就是:~x = -(x+1)

print(5^7) # 5異或7,輸出是:2
print(5<<2) # 5左移2位,輸出是:20
print(-5<<2) # -5左移2位,輸出是:-20
print(5>>2) # 5右移2位,輸出是:1
print(-5>>2) # -5右移2位,輸出是:-2

左移是將操作數的二進制碼整體左移指定位數,左移后右邊空出來的位以0填充。負數左移時,要先計算其補碼,使用補碼左移后得到值。右移是將操作數的二進制碼右移指定位數后,左邊空出來的位以原來的符號位填充。即:如果第一個操作數原來是正數,則左邊補0;如果第一個操作數是負數,則左邊補1。負數右移時,同樣要先計算補碼,根據補碼右移。

位移運算只適合對整型數進行運算

在進行位移運算時,左移n位相當於乘以2的n次方,右移n位則相當於除以2的n次方(如果不能整除,實際返回的結果是小於除得結果數值的最大整數的)。位移運算不會改變原來的操作數本身。

四、 賦值運算符擴展

賦值運算可以與算術運算符、位移運算符等結合。擴展后的賦值運算符如下:
x += y:相當於 x = x + y
x -= y:相當於 x = x - y
x *= y:相當於 x = x * y
x /= y:相當於 x = x / y
x //= y:相當於 x = x // y
x %= y:相當於 x = x % y
x **= y:相當於 x = x ** y
x &= y:相當於 x = x & y
x |= y:相當於 x = x | y
x ^= y:相當於 x = x ^ y
x <<= y:相當於 x = x << y
x >>= y:相當於 x = x >> y

五、 索引運算符

索引運算符在字符串中經常使用,對應的符號是方括號([]),在方括號中可以使用單個索引值,還可以使用索引范圍。在使用索引范圍時,還可指定步長。示例如下:
s = "hellopython"
print(s[3:10:2]) # 獲取索引3到10的子串,步長為2,輸出:lpto
print(s[3:10:3]) # 獲取索引3到10的子串,步長為3,輸出:lyo

六、比較運算符與 bool 類型

Python中的 bool 類型有兩種值:真(True)和 假(False)。在Python中,不等於0的數字(包括負數)都是True,字符或字符串也是True。等於0的數字或者空值為False。此外,True 還可當做數字1進行算術運算,False 可當做數字0進行算術運算

比較運算符判斷兩個值(變量、常量、表達式均可)之間的大小,運算結果為真 或 假值。Python中的比較運算符有如下這些:
大於(>)、大於或等於(>=)、小於(<)、小於或等於(<=)、等於(==)、不等於(!=)、判斷兩個變量引用的對象是否相同(is)、判斷兩個變量引用的對象是否不相同(is not)。示例如下:
print(5>4) # 輸出:True
print(5>4>3) # 實際做的比較是:5>4 and 4>3,輸出是:True
print(5>4 and 4>3) # 輸出是:True
print(3 ** 3 >= 28) # 3的3次方是否大於或等於28,輸出是:False
print(10 >= 10.0) # 10 是否大於或等於 10.0,輸出是:True
print(10 == 10.0) # 10 是否等於 10.0,輸出是:True
print(True == 1) # True 是否等於數字 1,輸出是:True
print(False == 0) # False 是否等於數字 0,輸出是:True
print(True + False) # 輸出:1
print(False - True) # 輸出:-1

等於(==)與 is 的區別,== 只比較兩個變量的值,is 是判斷兩個變量是否引用同一個對象。Python有一個全局(內置)函數可判斷變量所引用的對象的內存地址(對象在計算機中存儲的門牌號),如果兩個對象所在的內存地址相同(計算機同一塊內存在任一時刻只能存放一個對象),則說明這兩個對象其實是同一個對象。is 就是通過 id() 函數計算兩個對象時判斷返回的地址是否相同。示例如下:
import time
a = time.gmtime()
b = time.gmtime()
print(a == b) # 輸出是:True
print(a is b) # 輸出是:False
print(id(a))
print(id(b)) # a 和 b 的內存地址不一樣,所以 a is b 是False

七、 邏輯運算符

邏輯運算符用於操作 bool 類型的變量、常量、表達式,邏輯運算的返回值也是 bool 值。邏輯運算符有下面三個:
邏輯與(and):兩個操作數都為True,才返回True,否則返回False。
邏輯或(or):兩個操作數中有一個為True,就返回True。兩個都為False時,才返回False。
邏輯非(not):只要一個操作數,用常於反轉條件,當操作數為True,則返回False;當操作數為False,則返回True。

示例如下:
print(not True) # 對True取非運算,輸出是:False
print(5>4 and 4>3) # 同時判斷兩個條件,輸出是:True
print("4" > "5" or "b" > "a") # 輸出:True

當使用多個邏輯運算組合成復雜的邏輯時,通常要使用圓括號來明確運算順序,同時也提高程序的可讀性。

八、三目運算符

Python中通過 if 語句實現三目運算符功能。語法格式如下:
True_statements if expression else False_statements
首先對邏輯表達式(expression)求值,如果 expression 返回 True,則執行並返回 True_statements 的值;如果 expression 返回 False,則執行並返回 False_statements 的值。示例如下:
x = 8
y = 5
res = "x大於y" if x > y else "x小於y"
print(res) # 輸出:x大於y
print("x大於y") if x > y else print('x小於y') # 還可使用這種形式的三目運算符
print("x大於y" if x > y else 'x小於y') # 使用這種形式也是可以的

在True_statements 或 False_statements 中可以放置多條語句。支持的主要方式有兩種:
(1)、多條語句以英文逗號隔開:每條語句都會執行,程序返回多條語句的返回值組成的元組。
(2)、多條語句以英文分號隔開:每條語句都會執行,程序只返回第一條語句的返回值。


對於第一種情況,示例如下:
res = print("python"), "x大於y" if x > y else "x小於y" # 執行這條語句輸出:python
print(res) # 輸出是:(None, 'x大於y')
這里的 True_statements 是 (print("python"), "x大於y"),這兩條語句都會執行,程序返回這兩條語句的返回值組成的元組。
由於 print() 函數沒有返回值,相當於返回值是 None。所以輸出是 (None, 'x大於y')。

將上面語句的逗號改為分號,並且修改逗號之后的語句,示例如下:
res = print("python"); z = 10 if x > y else "x小於y" # 執行這條語句輸出:python
print(res) # res 只有分號前面語句的返回值,輸出:None
print(z) # 分號后面的語句同樣被執行了,所以輸出:10

另外,三目運算符支持嵌套,通過嵌套三目運算符,可執行更復雜的判斷。示例如下:
x = 10
y = 10
print("x大於y" if x > y else ("x小於y" if x < y else "x等於y")) # 輸出是:x等於y

九、in運算符

in 運算符可判斷某個成員是否在序列中,例如判斷某個字符是否在某個字符串中。in 的反義詞是 not in,判斷的結果都是 bool 型值。

print('on' in 'python.org') # 輸出:True
print('on' not in 'python.org') # 輸出:False
print('linux' not in 'python.org') # 輸出:True

十、 運算符的結合性和優先級

數學運算是從左向右進行的,Python中大部分運算也是從左向右結合的。但是單目運算符、賦值運算符和三目運算符例外,它們是從右向左結合的,也就是從右向左運算的。

乘法和加法是兩個可結合的運算符,這兩個運算符左右兩邊的操作數可以互換位置而不影響結果。

此外,運算符有不同的優先級,優先級高的會先計算。按優先級從高到低排列,如下所示:
image
根據上面的運算符優先級可知,5+5<<2語句的執行順序是,先執行 5+5 得到結果10,再執行 10<<2 得到40。可以使用圓括號來改變執行順序,例如 5+(5<<2) 會先執行 5<<2 的結果20與5相加,得到25。

雖然運算符有優先級順序,但是不要過度依賴運算符的優先級,這樣會造成程序可讀性變差。通常一個表達式太復雜,可分成幾步來完成。另外,當需要明確執行順序時,盡量使用圓括號來表示。


練習二

# 輸入兩個整數,並輸出這兩個整數的整除結果和帶小數的除法結果
num_str = input("請輸入兩個整數,以空格做分隔:")
num_list = num_str.split(" ")
print("%s // %s = %i" % (num_list[0], num_list[1], int(num_list[0]) // int(num_list[1])))
print("%s / %s = %f" % (num_list[0], num_list[1], int(num_list[0]) / int(num_list[1])))

# 從標准輸入讀取兩個整數,並打印三行,第一行是兩個整數的和,第二是兩個整數的差,第三行是兩個整數的乘積
num_str = input("請輸入兩個整數,以空格做分隔:")
num_list = num_str.split(" ")
num1, num2 = int(num_list[0]), int(num_list[1])
print("%d + %i = %d" % (num1, num2, num1 + num2))
print("%d - %i = %d" % (num1, num2, num1 - num2))
print("%d * %i = %d" % (num1, num2, num1 * num2))

# 輸入兩個字符串,第一個是字符串,第二個子串,要求判斷子串在字符串中出現的次數,如ABCDCDC和CDC,程序輸出是2
fist_str = input("請輸入第一個字符串:")
second_str = input("請輸入第二個子串:")
fist_str_length = len(fist_str)
second_str_length = len(second_str)
n = 0
count = 0
if second_str_length > fist_str_length:
print(count)
elif second_str_length == 1:
print(fist_str.count(second_str))
else:
for _ in range(1, fist_str_length - 1):
if fist_str[n:second_str_length] == second_str:
count += 1
n += 1
second_str_length += 1
else:
n += 1
second_str_length += 1
print(count)

# 輸入一個任意整數,輸出該整數的十進制、八進制、十六進制、二進制形式的字符串
num = int(input("請輸入一個整數:"))
print("十進制形式:%s" % num)
print("八進制形式:%o" % num)
print("十六進制小寫形式:%x" % num)
print("十六進制大寫形式:%X" % num)
print("二進制形式:%s" % bin(num))

# 修改字符串,要求輸入一個字符,修改字符串中指定的位置,例如 6 @ 表示將字符串中6的位置修改為 @ 符號
s = input("請輸入一個字符串:")
r = input("請輸入修改位置及修改符號,以空格分隔,例如 “6 @”:")
r_list = r.split(" ")
index = int(r_list[0])
s1 = s[0:index] # 如果 index 是 0,則 s[0:0] 是空值
s2 = s[index+1:]
print("修改后的字符串是:", s1 + r_list[1] + s2)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM