在上一節中,我們開始研究了 Python 變量和對象的語義。 在這裏,我們將深入探討該語言中包含的各種運算符的語義。 在本節的最後,您將擁有可以開始比較和處理 Python 中的數據的基本能力。
算術運算符
Python實現了七個基本的二元算術運算符,其中兩個可以兼作一元運算符。 下表中彙總了它們:
可以用直觀的方式使用和組合這些運算符,也可以使用標準括號將操作符組合在一起。 例如:
# addition, subtraction, multiplication
(4 + 8) * (6.5 - 3)
42.0
向下取整除法是捨去小數部分的除法:
# True division
print(11 / 2)
5.5
# Floor division
print(11 // 2)
5
向下取整除法運算符是在 Python 3 中添加的; 您需要知道,如果在 Python 2 中工作,則標準除法運算符(/)的作用類似於整數的向下取整除法和浮點數的真除法。
最後,我將提一下在 Python 3.5 中添加的第八個算術運算符:a @ b運算符,用於表示 a 和 b 的矩陣乘積,用於各種線性代數軟件包。
按位運算符
除了標準的數值運算,Python 還包括對整數執行按位邏輯運算的運算符。 與標準算術運算相比,它們的使用率要低得多,但是知道它們的存在是很有用的。 下表總結了六個按位運算符:
這些按位運算符僅在數字的二進制表示形式上有意義,可以使用內置的 bin 函數將數字轉換爲二進制形式:
bin(10)
'0b1010'
結果以“ 0b”爲前綴,表示二進制形式。 其餘數字表示數字10 等於總和
同樣,我們可以這樣寫:
bin(4)
'0b100'
現在,使用按位或,可以找到將4和10的位組合在一起的數字:
4 | 10
14
bin(4 | 10)
'0b1110'
這些按位運算符並不像標準算術運算符那樣常用,但是至少瀏覽一下以瞭解它們執行什麼類型的操作是有幫助的。 尤其是,來自其他語言的用戶有時會在真正表示冪運算(即a ** b)時卻是使用XOR(即a ^ b)。
賦值運算符
我們已經看到可以使用“ =”運算符來給變量賦值,並且存儲這些值以供以後使用。 例如:
a = 24
print(a)
24
我們可以在表達式中使用前面提到的任何運算符使用這些變量。 例如,將2加到 a 我們這樣寫:
a + 2
26
我們可能想用新值更新這個變量 a。 在這種情況下,我們可以將加法和賦值結合起來並編寫爲 a = a +2。由於這種將運算和賦值結合在一起的操作非常普遍,所以 Python 內置了包括用於所有算術運算的更新運算符:
a += 2 # equivalent to a = a + 2
print(a)
26
下表是對應於前面列出的每個二元運算符的擴展賦值運算符; 簡而言之,它們是:
每個等價於先對操作符左邊的變量進行對應的操作,然後進行賦值:也就是說,對於任何運算符“■”,表達式a■= b等效於a = a■b,對於諸如列表,數組或 DataFrame 之類的可改變對象,這些擴展賦值操作(a■= b)實際上與它們更爲冗長操作寫法(a = a■b)略有不同:它們修改了原始對象的內容,而不是創建一個新的對象來存儲結果。
比較運算符
另一種非常有用的操作是比較不同的值。 爲此,Python 實現了標準比較運算符,該運算符返回布爾值 True 和 False。 下表列出了比較運算符:
這些比較運算符可以與算術運算符和按位運算符結合使用,以表示數字的幾乎無限範圍的測試。 例如,我們可以通過檢查 2 的模數是否返回1來判斷數字是否爲奇數:
# 25 is odd
25 % 2 == 1
True
# 66 is odd
66 % 2 == 1
False
我們可以將多個比較串聯在一起,以檢查更復雜的關係:
# check if a is between 15 and 30
a = 25
15 < a < 30
True
然而,只是爲了讓您產生一點點頭疼的感覺,請看一下此比較:
-1 == ~0
True
回想一下〜是位翻轉運算符,顯然,當您翻轉所有零位時,最終得到-1。 如果您對爲什麼是這樣感到好奇,請查找二進制整數的補碼編碼方案(這裏涉及到了計算機的基礎知識,爲什麼計算機採用二進制補碼錶示整數?),這是 Python 用來編碼帶符號整數的方法,並考慮一下當您開始翻轉以這種方式編碼的所有整數位時會發生什麼。
布爾運算符
Python提供了布爾運算符,使用標準概念“and”,“or” 和 “not”的來組合值。 可以預想到的是,這些運算符就是使用單詞 and , or和 not 表示:
x = 4
(x < 6) and (x > 2)
True
(x > 10) or (x % 2 == 0)
True
not (x < 6)
False
布爾代數愛好者可能會注意到不包括 XOR 運算符。 當然,可以使用其他運算符的複合語句,用不同的方式構造它。 然而,您可以使用以下巧妙技巧對布爾值進行XOR:
# (x > 1) xor (x < 10)
(x > 1) != (x < 10)
False
當我們開始討論諸如條件和循環之類的控制語句時,這類布爾運算將變得非常有用。
關於該語言的一個有時令人困惑的事情是何時使用布爾運算符(and,or,not),何時使用按位運算符(&,|,〜)。 答案在於它們的名稱:當您要計算整個語句的布爾值(即真或假)時,應使用布爾運算符。 當您要對有關對象的單個位或組件進行操作時,應使用按位操作。
相同和成員關係運算符
與 and, or 和 not 一樣,Python 還包含類似散文的運算符,以檢查相同(一致性)和成員關係。 它們是:
相同運算符:“is”和“is not”
相同運算符“is”和“is not”檢查對象是否是同一個。 對象相同不同於相等,正如我們在這裏看到的:
a = [1, 2, 3]
b = [1, 2, 3]
a == b #a 與 b 的值(內容)相等
True
a is b #a 與 b 不是同一個對象
False
a is not b
True
相同的對象是什麼樣的? 這是一個例子:
a = [1, 2, 3]
b = a #b 和 a 現在指向相同的列表對象[1, 2, 3]
a is b
True
上面兩種情況之間的區別在於,在第一種情況下,a 和 b 指向不同的對象,而在第二種情況下,它們指向同一個對象。 如上一節所述,Python變量是指針。 “ is”運算符檢查兩個變量是否指向同一容器(對象),而不是指向該容器包含的內容。 考慮到這一點,在大多數情況下,初學者常常使用 “is”,但是他們真正想要的是 ==.
Python tutor 能夠直觀顯示object 引用關係:
成員關係運算符
成員關係運算符檢查複合對象內的成員關係。 因此,例如,我們可以編寫:
1 in [1, 2, 3]
True
2 not in [1, 2, 3]
False
這些成員關係運算是與低級別語言(例如 C 語言)相比使 Python 如此容易使用的一個示例。在 C 語言中,成員關係通常是通過手動在列表上構造一個循環並檢查每個值的相等性來確定的。 在 Python 中,您只需鍵入想知道的內容,就像日常英語使用的表達一樣。
本文來自翻譯如下文章,僅用於學習
原文:https://jakevdp.github.io/WhirlwindTourOfPython/04-semantics-operators.html
更多教程請關注“數據分析處理”