說明:變數的賦值與計算都離不開表示式,表示式的運算依賴於變數、常量和運算子。那麼我們先說一說什麼是表示式。
1、表示式介紹
- Python表示式是變數、常量、運算子、方法呼叫的序列,它執行指定的計算並返回某個確定的值。
- 表示式不會對程式產生實質性的影響, 一般只是返回一個結果。
- 在Python中,如果在互動模式中只輸入一個表示式,直譯器會自動將表示式的結果輸出。如果是在Python檔案中只輸入表示式,執行檔案都不會有任何輸出的。
示例1:互動模式中只寫表示式。
在互動模式中只輸入一個表示式,直譯器會自動將表示式的結果輸出,如下圖所示:
示例2:Python檔案中只寫表示式的語句會沒有任何輸出。
如下圖所示:
檔案中的100+200
和15+7
這兩個表示式都沒有在控制檯中輸出結果。
2、運算子
運算子用於執行程式程式碼運算。
(1)運算子的分類
Python的常用運算子分為5類:
- 算數運算子
- 賦值運算子
- 複合賦值運算子
- 比較運算子
- 邏輯運算子
(2)算數運算子
Python中算數運算子如下:
運算子 | 描述 | 例項 |
---|---|---|
+ |
加 | 1 + 1 輸出結果為 2 |
- |
減 | 1-1 輸出結果為 0 |
* |
乘 | 2 * 2 輸出結果為 4 |
/ |
除 | 10 / 2 輸出結果為 5 |
// |
整除 | 9 // 4 輸出結果為2 |
% |
取餘 | 9 % 4 輸出結果為 1,也叫取模 |
** |
指數 | 2 ** 4 輸出結果為 16,即 2 * 2 * 2 * 2 |
() |
小括號 | 小括號用來提高運算優先順序,即 (1 + 2) * 3 輸出結果為 9 |
注意:混合運算優先順序順序:
()
高於**
高於*
/
//
%
高於+
-
示例:
# 1、運算子:加、減、乘
# 所有運算中,只要有浮點數參加的運算,一定會得到一個浮點數
a = 10.5 + 5
print(f'a = {a}') # a = 15.5
# 2、運算子:除
# 除法不管得到什麼數,結果都是小數(浮點型),//(整除不會)
b = 4 / 2
print(f'b = {b}') # b = 2.0
# 3、運算子://(整除),只會保留整數位
# 運算結果只會得到一個整型,結果只保留整數部分。
c = 4 // 2
print(f'c = {c}') # c = 2
# 如果除數或被除數是小數,則返回一個浮點數
c = 4.567 // 2
print(f'c = {c}') # c = 2.0
# 4、用變數d的值減去2,然後再賦值給d
d = 10
d = d - 2
print(f'd = {d}') # d = 8
"""
5、如果將字串和數字相乘,
則會對字串進行復制操作,
將字串重複指定次數
6、如果對字元進行加法運算,
就是字串的拼接
"""
e = 'hello' + ' ' + 'world'
print(e) # hello world
f = ('hello' + ' ') * 2
print(f) # hello hello
# 7、除0異常
g = 5 / 0
# 報出異常:ZeroDivisionError: division by zero
(3)賦值運算子
運算子 | 描述 | 例項 |
---|---|---|
= |
賦值 | 將= 右側的結果賦值給等號左側的變數 |
(1)單個變數賦值
num = 1
print(num)
(2)多個變數賦值
num1, float1, str1 = 10, 0.5, 'hello world'
print(f"num1 = {num1}")
print(f"float1 = {float1}")
print(f"str1 = {str1}")
# 輸出結果如下:
# num1 = 10
# float1 = 0.5
# str1 = hello world
(3)多變數賦相同值
a = b = 10
print(f"a = {a}")
print(f"b = {b}")
# 輸出結果如下:
# a = 10
# b = 10
(4)複合賦值運算子
當直譯器執行到複合賦值運算子時,先計算算數運算子的表示式,再將算數運算子執行後的結果賦值到等號左邊的變數。
複合賦值運算子如下:
運算子 | 描述 | 例項 |
---|---|---|
+= |
加法賦值運算子 | c += a 等價於 c = c + a |
-= |
減法賦值運算子 | c -= a 等價於 c = c - a |
*= |
乘法賦值運算子 | c *= a 等價於 c = c * a |
/= |
除法賦值運算子 | c /= a 等價於 c = c / a |
//= |
整除賦值運算子 | c //= a 等價於 c = c // a |
%= |
取餘賦值運算子 | c %= a 等價於 c = c % a |
**= |
冪賦值運算子 | c ** = a 等價於 c = c ** a |
示例:
# 輸出101 a = a + 1,最終a = 100 + 1
a = 100
a += 1
print(a) # 101
# 輸出6 b = b * 3,最終b = 2 * 3
b = 2
b *= 3
print(b)
# 輸出13, 先算運算子右側1 + 2 = 3, c += 3 , 推匯出c = 10 + 3
c = 10
c += 1 + 2
print(c)
# 注意: 先算複合賦值運算子右面的表示式,再算複合賦值運算.
d = 100
d *= 3 + 4
print(d) # 700
# 3 + 4 = 7 * 100 = 700
在對浮點數做算術運算時,結果也會返回一個浮點數。
(5)比較運算子
比較運算子也叫關係運算子,來比較兩個值之間的關係,總會返回一個布林值, 如果關係成立,返回True,否則返回False,通常用來判斷。
比較運算子如下:
運算子 | 描述 | 例項 |
---|---|---|
== |
判斷相等。如果兩個運算元的結果相等,則條件結果為真(True),否則條件結果為假(False) | 如a=3,b=3,則(a == b) 為 True |
!= |
不等於 。如果兩個運算元的結果不相等,則條件為真(True),否則條件結果為假(False) | 如a=3,b=3,則(a == b) 為 True。如a=1,b=3,則(a != b) 為 True |
> |
運算子左側運算元結果是否大於右側運算元結果,如果大於,則條件為真,否則為假 | 如a=7,b=3,則(a > b) 為 True |
< |
運算子左側運算元結果是否小於右側運算元結果,如果小於,則條件為真,否則為假 | 如a=7,b=3,則(a < b) 為 False |
>= |
運算子左側運算元結果是否大於等於右側運算元結果,如果大於,則條件為真,否則為假 | 如a=7,b=3,則(a < b) 為 False。如a=3,b=3,則(a >= b) 為 True |
<= |
運算子左側運算元結果是否小於等於右側運算元結果,如果小於,則條件為真,否則為假 | 如a=3,b=3,則(a <= b) 為 True |
示例:
# 1、關係運算子基本使用
a = 7
b = 5
print(a == b) # False
print(a != b) # True
print(a < b) # False
print(a > b) # True
print(a <= b) # False
print(a >= b) # True
# 2、數字可以可布林值比較,True=1,False=0
print(1 == True) # True
print(2 < True) # False
print(-1 < False) # True
# 3、數字和字串之間不能進行比較
print(2 > '1')
# TypeError: '>' not supported between instances of 'int' and 'str'
"""
# 4、字串和字串之間可以進行比較
在Python中可以對兩個字串進行大於(等於)或小於(等於)的運算時,
實際上比較的是字串對應的Unicode編碼。
比較兩個字串的Unicode編碼時,是逐位比較的。
利用該特性可以對字串按照字母順序進行排序,但是對於中文來說意義不是特別大。
注意:如果不希望比較兩個字串的Unicode編碼,
則需要通過資料型別轉換
將字串轉換為數值型然後再比較。
"""
# a(0061) 和 b(0062) 比較
print('a' > 'b') # False
# 比較兩個字串的Unicode編碼時,是逐位比較的。
# 也就是第一位和第一位比,第二位和第二位比,
# 只有在第一位沒有比出結果的時候(相等),才比第二位。
print('ab' > 'bc') # 實際上就是a和b比較,結果False
print('ab' > 'b') # 同上一句結果
print('af' > 'ac') # True
# 沒有肯定小於有字元
print('a' > 'ac') # False
# 將字串轉換成數值型在比較
print(int('5') > int('7')) # False
print(float('5.115') > float('4.64')) # True
"""
5、== 和 != 比較的是結果物件的值,而不是id。
物件包括id(地址)、type(型別)、value(值)
比較id用is 和 is not
is 比較兩個物件是否是同一個物件,比較的是物件的id。
is not 比較兩個物件是否不是同一個物件,比較的是物件的id。
這裡有個印象就可以,以後說完可變物件,再詳細說明。
"""
print(1 == True) # True
print(id(1),id(True)) # 8791323868224 8791323365904
print(1 is True) # False
print(1 is not True) # True
3、邏輯運算子
邏輯運算子主要用來做一些邏輯判斷。
邏輯運算子如下:
運算子 | 邏輯表示式 | 描述 | 例項 |
---|---|---|---|
and |
x and y |
邏輯"與":如果 x 為 False,x and y 返回 False,否則它返回 y 的值。(一假則假,都真才真) | True and False, 返回 False。 |
or |
x or y |
邏輯"或":如果 x 是 True,它返回 True,否則它返回 y 的值。(一真則真,都假才假) | False or True, 返回 True。 |
not |
not x |
邏輯"非":如果 x 為 True,返回 False 。如果 x 為 False,它返回 True。(就是結果取反) | not True 返回 False, not False 返回 True |
"""
1、and 邏輯與 (一假則假,都真才真)
and可以對符號兩側的值進行與運算。
只有在符號兩側的值都為True時,才會返回True,只要有一個False就返回False
Python中的與運算是短路的與,也就是說與運算是找False的,
如果第一個值為False,則不再看第二個表示式的結果。
"""
print(True and True) # True
print(True and False) # False
print(False and True) # False
print(False and False) # False
# 驗證and為短路與,找False結束
# 第一個值是True,會執行print()
True and print('1你猜我出來嗎?')
# 第一個值是False,不會執行print()
False and print('2你猜我出來嗎?')
"""
2、or 邏輯或 (一真則真,都假才假)
or 可以對符號兩側的值進行或運算。
或運算兩個值中只要有一個True,就會返回True。
Python中的或運算是短路的或, 或運算是找True的,
如果第一個值為True,則不再看第二個值。
"""
print(True or True) # True
print(True or False) # True
print(False or True) # True
print(False or False) # False
# 驗證or為短路或,找True結束
# 第一個值是True,不會執行print()
True or print('1你猜我出來嗎?')
# 第一個值是False,會執行print()
False or print('2你猜我出來嗎?')
"""
3、not 邏輯非(取反)
not可以對符號右側的值進行非運算
對於布林值,非運算會對其進行取反操作,True變False,False變True
對於非布林值,非運算會先將其轉換為布林值,然後再取反:
空性值為False,其他為True。
"""
a = True
# 如果表示式不賦值。不會對變數a有任何影響,
# 只是建立了一個新物件儲存了結果,
# 同資料型別轉換所講的
not a
# 對變數a賦值之後,表達是結果才影響變數a。
a = not a
print(f"a = {a}") # a = False
# 4、邏輯運算子左右的表示式加上(),並不會影響運算的結果。
# 為什麼要加上(),避免歧義,增加可讀性。
a = 1
b = 2
c = 3
print((a < b) and (b < c)) # True
print((a > b) and (b < c)) # False
print((a > b) or (b < c)) # True
print(not (a > b)) # True
擴充1:數字之間的邏輯運算
# 也就是非布林值的與或運算
# 當我們對非布林值進行與或運算時,Python會將其當做布林值運算,最終會返回原值。
#
# 1、與運算的規則
# 與運算是找False的,
# 如果第一個值是False,則不看第二個值,則直接返回第一個值。(返回0)
# 如果第一個值是True,否則返回第二個值。(看第二個值:False返回0,True返回原值)
# 2、或運算的規則
# 或運算是找True的,
# 如果第一個值是True,則不看第二個值,則直接返回第一個值(原值)。
# 如果第一個值是False,否則返回第二個值。(看第二個值:False返回0,True返回原值)
a = 0
b = 1
c = 2
# and運算子,只要有一個值為0,則結果為0,否則結果為最後一個非0數字
print(a and b) # 0
print(b and a) # 0
print(a and c) # 0
print(c and a) # 0
print(b and c) # 2
print(c and b) # 1
# or運算子,只有所有值為0結果才為0,否則結果為第一個非0數字
print(a or b) # 1
print(a or c) # 2
print(b or c) # 1
"""
總結:
兩種描述都正確,我確認過。
看自己適合哪種理解思路,就用哪種。
"""
擴充2:Python中邏輯運算子可以連續使用
# 邏輯運算子(補充)
# 邏輯運算子可以連著使用
"""
1 < 2 < 3 的意思不是1小於2同時小於3,
相當於 1 < 2 and 2 < 3,
是以中間數值進行比較的
"""
result = 1 < 2 < 3
print(result) # True
# 相當於 10 < 20 and 15 < 20
result = 10 < 20 > 15
print(result) # True
4、Python運算子優先順序
- 運算子的優先順序可以根據Python官方提供的優先順序的表格來查詢,
- 在表格中位置越靠下的運算子優先順序越高,優先順序越高的越優先計算。
- 如果優先順序一樣則自左向右計算。
Python官方提供的優先順序的表格,我們安裝好Python的直譯器就在本地有一份官方文件了。
官方文件位置:[開始] —> [所有程式] —> [ Python 3.7
] —> [Python 3.7 Manuals (64-bit)
]。
開啟文件:[The Pthon Language Reference
] —> [Expressions
] —> [ Operator precedence
] 即可檢視。
如下圖所示:
提示:
關於優先順序的表格,你知道有這麼一個東西就夠了,千萬不要去記。
在開發中如果遇到優先順序不清楚的,主要通過小括號來改變運算順序。