簡介
August 8, 2015 · View on GitHub
程式中的大部分語句 (邏輯行) 中都包含了表達式。
舉一個簡單的的語句為例子:
i = 2 + 3
我們可以將這行語句分解為三部份 -- 左手邊的敘述,賦值運算符號(等號 '='),還有右手邊的敘述。
這個例子中,左手邊的敘述是一個變量 i。 因為我們將要取得一個數值,而只有變量才能儲存數值,所以在左手邊我們只有單一一個變量。
右手邊的敘述中包含了 '2 + 3' 這個表達式。 這個表達式本身也可以分解為三個部份 -- 第一個運算元 '2',運算符號 '+'(加法符號),第二個運算元 '3'。
運算符號(運算符)的功能是處理某些事,以諸如加法"+"等符號或其他特定關鍵自來表示。 運算符號需要一些資料來作運算,這些資料被稱為運算單元(運算元)。
運算符號
我們將簡單瀏覽一下運算符號 (Operators)和它們的用法。
你可以使用周蟒的互動式直譯器來輸入這些範例,並馬上獲得運算的結果。
比如,要測試 '2 + 3' 這個表達式的結果,可以在互動式直譯器中輸入:
>>> 2 + 3
5
馬上可以獲得運算結果 '5'。
表5.1 運算符與它們的用法
| 運算符 | 名稱 | 說明 | 例子 |
|---|---|---|---|
| + | 加 | 兩個對象相加 | 3 + 5 得到 8。 'a' + 'b' 得到 'ab'。 |
| - | 減 | 得到一個負數或是一個數減去另一個數 | -5.2 得到一個負數。 50 - 24 得到 26。 |
* | 乘 | 兩個數相乘或是返回一個被重複若干次的字串 | 2 3 得到 6。 'la' 3 得到 'lalala'。 |
** | 冪 | 返回 x 的 y 次冪 | 3 4 得到 81 (即 3 3 3 3) |
| / | 除 | x 除以 y | 4/3 得到 1(整數的除法得到整數結果)。 4.0/3 或 4/3.0 得到 1.3333333333333333 |
| // | 取商數 | 返回商的整數部分 | 4 // 3.0 得到 1.0 |
| % | 取餘數 | 返回除法的餘數 | 8%3 得到 2。 -25.5%2.25 得到 1.5 |
| << | 左移 | 把一個數的位元向左移一定數目(每個數在記憶體中都表示為位元或二進制數字,即 0 和 1) | 2 << 1 得到 4。因為 2 用二進制表示時為 b10. 往左移一位元變成二進制的b100,二進制的b100 用十進制表示則為 4 |
| >> | 右移 | 把一個數的位元向右移一定數目 | 11 >> 1得到5。因為 11 用二進制表示時為 b1011,向右移動1位元後得到b101,即十進制的 5。 |
| & | 位元和 (Bitwise AND) | 數的位元和 | 5(b101) & 3(b11) 得到 1(b1)。 |
| 位元或 (Bitwise OR) | 數的位元或 | ||
| ~ | 位元翻轉 | 位元翻轉 | x 的位元翻轉是 -(x+1) ~5(b101) 得到 -6(-b110)。 |
| < | 小於 | 比較運算符,返回 x 是否小於 y 的結果。如果返回 1 表示真,如果返回 0 表示假。 Python 中也可以用特殊的變量 'True' 表示真, 用變量 'False' 表示假。注意特殊變量的名稱為大寫。 | 5 < 3 返回 0(即 False)而3 < 5 返回1(即True)。也可以任意連接比較運算符:3 < 5 < 7 返回 True。 |
| > | 大於 | 返回 x 是否大於 y | 5 > 3 返回 True。如果兩個運算子都是數字,它們會先被轉換成相同的型別後才開始計算。如果 x 和 y 型別不同, 則會返回 False。 |
| <= | 小於等於 | 返回 x 是否小於等於 y | x = 3; y = 6; x <= y 返回 True。 |
| >= | 大於等於 | 返回 x 是否大於等於 y | x = 4; y = 3; x >= y 返回 True。 |
| == | 等於 | 比較兩個對象是否相等 | x = 2; y = 2; x == y 返回 True。x = 'abc'; y = 'Abc'; x == y 返回 False。 |
| != | 不等於 | 比較兩個對象是否不相等 | x = 2; y = 3; x != y 返回 True。 |
| not | 布林「非」 | 如果 x 為 None (空), 0, False, 或空字串。則 not x 會返回 True, 否則 not x 會返回 False。 | x = True; not x 返回 False。 x = ; not x 返回 True. |
| and | 布林「和」 | 如果 x 為 False,x and y 返回 False,否則它會返回 y 的計算值。 | x = False; y = True; x and y 的結果會返回 False。在這個例子裡, Python 語言並不會計算 y 的值,因為 x 的值已經是 False, 所以這個表達式的值肯定是 False。這個現象稱為短路計算。 |
| or | 布林「或」 | 如果 x 為 True,則返回 True,否則則返回 y 的計算值。 | x = True; y = False; x or y 的結果會返回 True。 短路計算在這裡也適用。 |
運算符號優先級
如果你有一個如2 + 3 * 4那樣的表達式,是先做加法呢,還是先做乘法?
我們的中學數學告訴我們應當先做乘法——這意味著乘法運算符號的優先級高於加法運算符。
http://www.mathsisfun.com/operation-order-bodmas.html
下面的表格給出周蟒語言的運算符號優先級,從最低的優先級(最鬆散地結合)到最高的優先級(最緊密地結合)。 這意味著在一個表達式中,周蟒會優先計算列表中較下面的運算符,然後再計算列表上部的運算符。
下面這張列表與 Python 參考手冊中的那個列表一模一樣, 因為這張表已經顧及了完整的需要。
我建議妳使用括弧來將運算符號和運算元分組,以便能夠明確地指出運算的先後順序,也能避免運算式不夠清楚易讀。
例如,2 + (3 * 4)顯然比2 + 3 * 4清晰。當然括弧也應該適時地使用,
不要在運算式不需要括弧就能表示地很清楚時時濫用(比如 2 + (3 + 4))。
這個範例中的括弧是多餘的, 因為加法運算元(+)運算的順序是由左至右,
而這個運算式中明顯地 2 + 3 將優先開始運算,加上括弧並未改變運算結果。
表5.2 運算符優先級
| 運算符 | 描述 |
|---|---|
| lambda | Lambda 表達式 |
| or | 布林「或」 |
| and | 布林「和」 |
| not x | 布林「非」 |
| in,not in | 成員測試 |
| is,is not | 認定測試 |
| <,<=,>, >=,!=,== | 比較 |
| ^ | 位元異或 |
| & | 位元和 |
| <<,>> | 移位 |
| +,- | 加法與減法 |
*,/,% | 乘法、除法、取餘數 |
| +x,-x | 正負符號 |
| ~x | 位元翻轉 |
** | 指數 |
| x.屬性,x.attribute | 屬性參考 |
| x[索引],xindex | 署名 |
| x[索引:索引],x[index:index] | 尋址段 |
| f(參數),f(arguments...) | 函數調用 |
| (表達式,...),(experession,...) | 綁定或元組顯示 |
| [表達式,...],[expression,...] | 列表顯示 |
| {鍵:值,...},{key:datum,...} | 字典顯示 |
| '表達式,...','expression,...' | 字串轉換 |
其中我們還沒有接觸過的運算符號將在後面的章節中介紹。
在列表中列在同一行的運算符號都具有相同優先級。例如,+ 和 - 有相同的優先級。
計算順序
一般來說, 運算符號優先級列表決定了哪些運算符號會在其他的運算符號之前被計算。
然而,如果你想要改變這些運算符號的計算順序,你得使用小括弧。
例如,在一個表達式'2 + 3 * 4'中,你想要先計算加法再計算乘法,那麼運算式就得寫成像'(2 + 3) * 4'這個樣子。
結合規律 (Associativity)
運算符你結合的規律通常是由左向右,即具有相同優先級的運算符都會按照由左至右的順序來進行計算。
例如,2 + 3 + 4 會以(2 + 3) + 4的順序來進行計算。
也有一些像賦值運算符那樣的運算符是由右向左結合的,比如 a = b = c 的運算順序為 a = (b = c)。
表達式 (Expressions)
讓我們來看看如何使用表達式的範例:
#!/usr/bin/env zhpy
# 檔名: expression.twpy
長 = 5
寬 = 2
面積 = 長 * 寬 # 面積 = 長 * 寬
印出 '面積是', 面積
印出 '周長是', 2 * (長 + 寬) # 周長為 2 倍的長加寬
輸出結果:
$ zhpy expression.twpy
面積是 10
周長是 14
python 版:
#!/usr/bin/env python
# File name: expression.py
length = 5
breadth = 2
area = length * breadth # 面積 = 長 * 寬
print 'Area is', area
print 'Perimeter is', 2 * (length + breadth) # 周長為 2 倍的長加寬
python 版輸出結果:
$ python expression.py
Area is 10
Perimeter is 14
程式如何運作
矩形的長與寬被儲存在同名的變量中。我們使用這些表達式來計算矩形的面積和周長。
我們將表達式 '長 * 寬' 運算的結果儲存至變量 '面積' 中,接著用 '印出' 語句輸出結果。
在第二個例子中, 我們直接將表達式'2 * (長 + 寬)' 運算產生的值用'印出'語句輸出。
另外,你可能注意到了周蟒的輸出多麼漂亮。即使我們沒有在'面積是'和變量'面積'之間指定空格, 周蟒語言自動在兩者間加上了一個空格,好讓我們得到一個清晰的輸出。程式碼本身也是同樣地保持清晰。
結語
我們已經學習了如何使用運算符、運算元和表達式。這些元素是所有周蟒程式的基本組成部分。
接下來,我們將學習如何在語句中利用這些表達式。