python運算符與表達式的用法?在了解了不同類型的變量之後,我們現在該用這些變量做點什麼了,接下來我們就來聊聊關于python運算符與表達式的用法?以下内容大家不妨參考一二希望能幫到您!
在了解了不同類型的變量之後,我們現在該用這些變量做點什麼了。
今天,我們将了解如何在變量上執行計算。你最終将會掌握如何使用變量和操作符來創建複雜的表達式。
Python 中,運算符(operators)是一些特殊的符号,用來指明可以執行某種計算。
那些被運算符操作的值叫做操作數(operands)。
>>> a = 10
>>> b = 20
>>> a b
30
這個簡單的例子中,運算符 将 a 和 b 兩個操作數相加。
操作數既可以是字面常量,也可以是指向對象的變量。
>>> a b -5
25
像 a b - 5 這樣由運算符和操作數組成的序列稱為表達式。
Python 提供了衆多的運算符來将各種對象組成表達式。
我們按照運算類型分别介紹一下這些運算符。
【算術運算符】
顧名思義,算術運算符是用來做算術運算的。
下表列舉了 Python 支持的算術運算符。
運算符 |
例子 |
用途 |
運算結果 |
(一元) |
a |
對操作數取正 |
a,無實際意義 |
(二元) |
a b |
操作數相加 |
a 和 b 之和 |
-(一元) |
-a |
對操作數取負 |
a的負數 |
-(二元) |
a - b |
操作數相減 |
a 和 b 之差 |
* |
a * b |
操作數相乘 |
a 和 b 之積 |
/ |
a / b |
操作數相除 |
a 除以 b 的商,結果為 float 類型 |
% |
a % b |
求模 |
a 除以 b 的餘數 |
// |
a // b |
地闆除(floor division):兩數相除,結果向下取整 |
a 除以 b 的商,并取小于等于且最接近此商值的整數 |
** |
a ** b |
幂運算 |
a 的 b 次幂 |
看一些例子:
>>> a = 4
>>> b = 3
>>> a
4
>>> -b
-3
>>> a b
7
>>> a-b
1
>>> a*b
12
>>> a/b
1.3333333333333333
>>> a%b
1
>>> a ** b
64
>>> a // b
1
除法(/)運算的結果始終為 float 類型,即使可以整除。
>>> 10 /5
2.0
>>> type(10 / 5)
<class 'float'>
對于地闆除(floor division),若結果為正,小數部分被舍棄;若結果為負,結果被約等為和其值最接近的不大于該值的整數。你可以這樣統一理解,地闆除的結果就是取數軸上結果點左側最靠近它的那個整數。
>>> 10 / 4
2.5
>>> 10 // 4
2
>>>
>>> 10 / -4
-2.5
>>> 10 // -4
-3
>>>
>>> -10 / -4
2.5
>>> -10 // -4
2
【比較運算符】
比較運算符用于比較兩個對象的“大小”。不同對象有其自定義的“大小”語義。
下表列舉了 Python 支持的比較運算符。
運算符 |
例子 |
用途 |
運算結果 |
== |
a == b |
比較操作數是否相等 |
True,若 a 等于 b;False,若不相等。 |
!= |
a != b |
比較操作數是否不等 |
True,若 a 不等于 b;False,若相等 |
< |
a < b |
小于比較 |
True,若 a 小于 b;False,若不小于 |
<= |
a <= b |
小于或等于比較 |
True,若 a 小于或等于 b;False,若大于 |
> |
a > b |
大于比較 |
True,若 a 大于 b;False,若不大于 |
>= |
a >= b |
大于或等于比較 |
True,若 a 大于或等于 b;False,若小于 |
看一些例子:
>>> a = 10
>>> b = 20
>>> a == b
False
>>> a != b
True
>>> a <= b
True
>>> a >= b
False
>>>
>>> b = 20
>>> a == b
False
比較運算符通常用于 Boolean 上下文中,比如條件和循環語句,以改變程序的控制流程。
這裡需要注意一下浮點數的等值比較。
我們在 Python 變量中介紹過,存儲在 float 對象中的數值可能并非你所想的那麼精确。因此,直接比較兩個浮點數是否相等,通常是不可取的操作。
>>> x = 1.1 2.2
>>>x==3.3
False
>>> x
3.3000000000000003
正确的做法是:比較兩個浮點數是否足夠接近彼此,它們的“距離”在可接受的誤差範圍内即認為兩者相等。
>>> distance = 0.00001
>>> x = 1.1 2.2
>>> abs(x - 3.3) < distance
True
【邏輯運算符】
邏輯運算符包括:not、or 和 and。這三者可連接和修改 Boolean 上下文中的表達式,從而表達更複雜的條件語義。
1,包含 Boolean 類型操作數的邏輯表達式
我們知道,Python 中有些對象和表達式的值可以是 True 或 False,這時候,這些對象和表達式實際上就是 Boolean 類型。
>>> x = 5
>>> x < 10
True
>>> type(x < 10)
<class 'bool'>
>>>
>>> t = x > 10
>>> t
False
>>> type(t)
<class 'bool'>
>>>
>>> callable(x)
False
>>> type(callable(x))
<class 'bool'>
>>>
>>> t = callable(len)
>>> t
True
>>> type(t)
<class 'bool'>
在上邊這些例子中,x<10、callable(x)、t 都是 Boolean 類型的對象或表達式。
當表達式中含有這些 Boolean 類型的操作數時,計算表達式的值很簡單。
可根據下表來計算:
運算符 |
例子 |
含義 |
not |
not x |
True,若 x 是False;False,若 x 是 True |
or |
x or y |
True,若 x 或 y 是 True;否則,False |
and |
x and y |
True,若 x 和 y 均為 True;否則,False |
看一些例子:
>>> x = 5
>>> x < 10
True
>>> not x < 10
False
>>> callable(x)
False
>>> not callable(x)
True
>>>
>>> x < 10 or callable(x)
True
>>> x < 0 or callable(x)
False
>>>
>>> x < 10 and callable(x)
False
>>> x < 10 and callable(len)
True
2,非 Boolean 類型的值在 Boolean 上下文中的求值
Python 中還有很多對象和表達式的值并不等于 True 或 False,即它們非 Boolean 類型。
盡管如此,在需要進行 Boolean 計算的環境中,這些對象或表達式也可以被适當處理,從而被視為“真值(truthy)”或“假值(falsy)”。
那麼,到底何為真?何為假?嗯,這可以上升為一個較難回答的哲學問題。
但在 Python 中,真與假卻是良好定義的。
在 Boolean 上下文中,以下這些情況均視作假:
其他 Python 内置的對象可判為真。
我們可以使用 bool() 函數來判斷一個對象或表達式是否為真。若參數為真值,bool() 返回 True,否則返回 False。
數字數值的 Boolean 判定方法:
值為 0 的數字為 False,非 0 值為 True。
>>> print(bool(0), bool(0.0), bool(0.0 0.0j))
False False False
>>> print(bool(-3), bool(3.14159), bool(1.0 1j))
True True True
字符串的 Boolean 判定方法:
空字符串為 False,非空字符串為 True。
>>> print(bool(''), bool(""), bool(""""""))
False False False
>>> print(bool('foo'), bool(" "), bool(''' '''))
True True True
内置組合類型對象的 Boolean 判定方法:
Python 内置的組合數據類型包括:list、tuple、dict 和 set。它們是可以包含其他對象的“容器”。
當這些容器不含任何其他對象時,這些容器就是空的。若容器為空,容器對象就視作假;容器非空,容器對象就視作真。
>>> type([])
<class 'list'>
>>> bool([])
False
>>> type([1, 2, 3])
<class 'list'>
>>> bool([1, 2, 3])
True
關鍵字 None 永遠為假。
>>> bool(None)
False
3,包含非 Boolean 類型操作數的邏輯表達式
非 Boolean 類型的值也可用在邏輯表達式中,通過 not、or 和 and 來修改或組合。表達式的計算結果依賴于這些非 Boolean 操作數的真假。
注意:這裡,表達式的結果不一定是 Boolean 值!
not 作用于非 Boolean 操作數:
當 x 為: |
not x 為: |
真值 |
False |
假值 |
True |
例如:
>>> x = 3
>>> bool(x)
True
>>> not x
False
>>>
>>> x = 0.0
>>> bool(x)
False
>>> not x
True
or 作用于非 Boolean 操作數:
當 x 為: |
x or y 為: |
真值 |
x |
假值 |
y |
例如:
>>> x = 3
>>> y = 4
>>> x or y
3
>>> x = 0.0
>>> y = 4.4
>>> x or y
4.4
and 作用于非 Boolean操作數:
當 x 為: |
x and y 為: |
真值 |
y |
假值 |
x |
例如:
>>> x = 3
>>> y = 4
>>> x and y
4
>>> x = 0.0
>>> y = 4.4
>>> x and y
0.0
4,複合表達式與短路求值
我們在上文列舉的例子都是使用了一個運算符和至多兩個操作數:
x or y
xand y
實際上,多個運算符和操作數也可以連在一起使用,形成複合邏輯表達式。
複合 or 表達式形式如下:
x1orx2orx3or...xn
當 xi 中任一操作數為True 時,表達式為 True。
在處理這類包含多個邏輯運算符的表達式時,Python 采用“短路求值”法來計算表達式的值。解釋器會從左向右逐一計算每個操作數 xi 的值。一旦遇到一個 xi 的值為 True,整個表達式就被認為是 True,此時,解釋器不再繼續向右計算,表達式的值就是最後那個已計算的 xi 操作數的值。
請注意體會“表達式的真假值”和“表達式的值”的區别,我們有時候會混用這兩個概念。
為便于理解“短路求值”,我們可以設計一個簡單的函數 f(),該函數的功能為:
這是幾個調用 f() 的例子:
>>> f(0)
-> f(0) = 0
0
>>>
>>> f(False)
-> f(False) = False
False
>>>
>>> f(1.5)
-> f(1.5) = 1.5
1.5
我們可以向 f() 傳遞具有真值或假值的參數,以使得 f(arg) 的值也為真或假。并且,通過控制台的輸出,我們能看到複合邏輯表達式中某一部分是否被調用了。
來看下邊這個複合邏輯表達式:
>>> f(0) or f(False) or f(1) or f(2) or f(3)
-> f(0) = 0
-> f(False) = False
-> f(1) = 1
1
按照上邊的介紹,f(0)、f(False) 依次被調用,直到 f(1) 為 True 時,表達式已能被判定為 True,計算到此結束,表達式的值就是 f(1) 的值。f(2) 和 f(3) 不會被執行到。
複合 and 表達式形式如下:
x1andx2andx3and ... xn
所有 xi 均為 True,表達式才為 True。
短路求值對複合 and 表達式的處理邏輯為:從左到右依次計算每個操作數的真假值,一旦遇到一個 xi 的值為 False,整個表達式就被判定為 False,計算結束,表達式的值就是最後那個已計算的 xi 操作數的值。
仍使用 f() 函數來看兩個例子:
>>> f(1) and f(False) and f(2) and f(3)
-> f(1) = 1
-> f(False) = False
False
>>>
>>> f(1) and f(0.0) and f(2) and f(3)
-> f(1) = 1
-> f(0.0) = 0.0
0.0
這兩個表達式的計算過程都停止在第一個為假值的操作數上:f(False)、f(0.0),表達式的值分别為 False 和 0.0。後邊的 f(2) 和 f(3) 沒有被調用。
如果所有的操作數都是真值,那麼它們都會被計算,最後一個操作數的值就是表達式的值。
>>> f(1) and f(2.2) and f('bar')
-> f(1) = 1
-> f(2.2) = 2.2
-> f(bar) = bar
'bar'
短路求值在實際應用中有一些慣用場景:
5,鍊式比較
在 Python 中,多個比較運算符可以串聯起來使用。
比如,下邊這兩個表達式基本相同:
>>>x<y<=z
>>>x<yandy<=z
它們有一點區别:y 的計算次數不同。x < y <= z 中,y 隻計算一次;x < y and y <= z 中,y 會被計算兩次。
如果 y 隻是一個靜态值,比如 1,這種差别微乎其微。但假如 y 是一個複雜的表達式,少一次計算可能會帶來可觀的效率上的提升。例如:
x < f() <= zx < f() and f() <= z
更一般的情況,如果 op1、op2、op...、opn 是比較運算符,那麼下邊的表達式具有相同的 Boolean 值:
x1op1x2op2x3...opn xn
x1op1x2andx2op2x3andx3 ... opn xn
同樣,前者中的 xi 隻計算一次,而後者中的非首尾的 xi 會計算兩次,除非計算提前結束。
【位操作運算符】
位操作運算符将操作數視為二進制序列,對操作數進行逐位運算。
下表列舉了 Python 支持的位操作運算符。
運算符 |
例子 |
含義 |
結果 |
& |
a & b |
按位與 |
兩個操作數對應位相與(全1則1,否則為0) |
| |
a | b |
按位或 |
兩個操作數對應位相或(有1則1,全0為0) |
~ |
~a |
取反 |
對操作數的每一位取反(0則1,1則0) |
^ |
a ^ b |
異或 |
兩個操作數對應位異或(異則1,同則0) |
>> |
a >> n |
右移 |
将操作數右移n位 |
<< |
a << n |
左移 |
将操作數左移n位 |
看一些例子:
>>> '0b{:04b}'.format(0b1100 & 0b1010)
'0b1000'
>>> '0b{:04b}'.format(0b1100 | 0b1010)
'0b1110'
>>> '0b{:04b}'.format(0b1100 ^ 0b1010)
'0b0110'
>>> '0b{:04b}'.format(0b1100 >> 2)
'0b0011'
>>> '0b{:04b}'.format(0b0011 << 2)
'0b1100'
這裡,以二進制的形式來表示操作數和運算結果,可以清晰地看出位運算的執行邏輯。
【ID 運算符】
id 運算符用于判斷兩個操作數是否擁有相同 id,也即是否指向同一對象。
這和“相等”不是同一個概念,相等表示兩個操作數的值相等,而它們不一定指向同一個對象。
Python 提供 is 和 is not 兩個 id 運算符。
看一些例子:
>>> a = 798
>>> b = 798
>>> a == b #相等
True
>>> a is b #id 不同
False
>>>
>>> a = 798
>>> b = a
>>>aisb#a、b指向同一對象,id 相同
True
可結合 《一文理解 Python 中的變量》來理解。
【運算符的優先級】
我們都知道算術中的混合運算可以包含多種運算符,這些運算符可改變運算順序。
>>> 20 4 * 10
60
在這個例子中,同時存在 和 * 兩種運算符,按照算術規則,先算乘法後算加法,乘法優先級高于加法。
Python 中的每個運算符也都有一定的優先級。優先級高的運算符先被執行,優先級相同的運算符按照從左向右的順序執行。
我們目前已使用了多種運算符,按優先級從低到高列表如下:
運算符 |
描述 | |
最低優先級 |
or |
Boolean 或 |
and |
Boolean 且 | |
not |
Boolean 非 | |
==、!=、<、<=、>、>=、is、is not |
比較運算、id運算 | |
| |
按位或 | |
^ |
異或 | |
& |
按位與 | |
<<、>> |
移位操作 | |
、- |
加減 | |
*、/、//、% |
乘除、地闆除、取模 | |
x、-x、~x |
一元正負、按位取反 | |
最高優先級 |
** |
幂運算 |
看一些例子:
>>> 2 * 3 ** 4 * 5
810
括号可以改變運算符的優先級,并且有助于理解運算的先後順序。
>>> 20 4 * 10
60
>>> (20 4) * 10
240
>>> 2 * 3 ** 4 * 5
810
>>> 2 * 3 ** (4 * 5)
6973568802
【擴展的賦值運算符】
賦值(=)運算符用于為變量賦值。既可以為變量賦靜态值,也可以為其賦予一個包含其他變量的表達式,并且表達式中還可以包含變量自身。
>>> a = 10
>>> b = 20
>>> c = a * 5 b
>>> c
70
>>> a = a 5
>>> a
15
>>> b = b * 3
>>> b
60
對于 a=a 5、b=b*3 這種賦值形式,其含義是在變量自身基礎上再進行賦值操作。其前提是,變量必須已經被賦予了初值,否則導緻錯誤。
>>> i = i / 12
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined
Python 為上邊這種賦值方式提供了一個簡寫形式:
x <op>= y
這種簡寫等同于:
x = x <op> y
支持這種擴展賦值方式的運算符包括:
、=、*、/、%、//、**、&、|、^、>>、<<
看一些例子:
>>> a = 5
>>> a = 2
>>> a
7
>>> b = 16
>>> b /= 4
>>> b
4.0
【結語】
本文詳細介紹了 Python 提供的各種運算符,以及如何這些運算符來生成表達式。
特别指出了浮點比較運算、短路求值等細節性問題,相信會對你理解和使用運算符和表達式提供幫助。
我們接下來會學一個非常重要的數據類型:字符串。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!