你編寫的大多數語句(邏輯行)都包含表達式。一個簡單的表達式例子如 2 + 3。一個表達式可以分解為運算符和操作數。
運算符 的功能是完成某件事,它們由如+這樣的符號或者其他特定的關鍵字表示。運算符需要數據來進行運算,這樣的數據被稱為 操作數 。在這個例子中,2 和 3 是操作數。
我們將簡單瀏覽一下運算符和它們的用法:
技巧
你可以交互地使用解釋器來計算例子中給出的表達式。例如,為了測試表達式 2 + 3,使用交互式的帶提示符的 Python 解釋器:
>>> 2 + 3
5
>>> 3 * 5
15
>>>
表 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 << 2得到8?!?按比特表示為10 |
| >> | 右移 | 把一個數的比特向右移一定數目 | 11 >> 1得到5?!?1按比特表示為1011,向右移動1比特后得到101,即十進制的5。 |
| & | 按位與 | 數的按位與 | 5 & 3得到1。 |
| | | 按位或 | 數的按位或 | 5 | 3得到7。 |
| ^ | 按位異或 | 數的按位異或 | 5 ^ 3得到6 |
| ~ | 按位翻轉 | x的按位翻轉是-(x+1) | ~5得到6。 |
| < | 小于 | 返回x是否小于y。所有比較運算符返回1表示真,返回0表示假。這分別與特殊的變量True和False等價。注意,這些變量名的大寫。 | 5 < 3返回0(即False)而3 < 5返回1(即True)。比較可以被任意連接:3 < 5 < 7返回True。 |
| > | 大于 | 返回x是否大于y | 5 > 3返回True。如果兩個操作數都是數字,它們首先被轉換為一個共同的類型。否則,它總是返回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 = 'str'; y = 'stR'; x == y返回False。x = 'str'; y = 'str'; x == y返回True。 |
| != | 不等于 | 比較兩個對象是否不相等 | x = 2; y = 3; x != y返回True。 |
| not | 布爾“非” | 如果x為True,返回False。如果x為False,它返回True。 | x = True; not y返回False。 |
| and | 布爾“與” | 如果x為False,x and y返回False,否則它返回y的計算值。 | x = False; y = True; x and y,由于x是False,返回False。在這里,Python不會計算y,因為它知道這個表達式的值肯定是False(因為x是False)。這個現象稱為短路計算。 |
| or | 布爾“或” | 如果x是True,它返回True,否則它返回y的計算值。 | x = True; y = False; x or y返回True。短路計算在這里也適用。 |
如果你有一個如 2 + 3 * 4 那樣的表達式,是先做加法呢,還是先做乘法?我們的中學數學告訴我們應當先做乘法——這意味著乘法運算符的優(yōu)先級高于加法運算符。
下面這個表給出 Python 的運算符優(yōu)先級,從最低的優(yōu)先級(最松散地結合)到最高的優(yōu)先級(最緊密地結合)。這意味著在一個表達式中,Python 會首先計算表中較下面的運算符,然后在計算列在表上部的運算符。
下面這張表(與 Python 參考手冊中的那個表一模一樣)已經顧及了完整的需要。事實上,我建議你使用圓括號來分組運算符和操作數,以便能夠明確地指出運算的先后順序,使程序盡可能地易讀。例如,2 + (3 4)顯然比 2 + 3 4 清晰。與此同時,圓括號也應該正確使用,而不應該用得過濫(比如 2 + (3 + 4))。
表 5.2 運算符優(yōu)先級
| 運算符 | 描述 |
|---|---|
| lambda | Lambda表達式 |
| or | 布爾“或” |
| and | 布爾“與” |
| not x | 布爾“非” |
| in,not in | 成員測試 |
| is,is not | 同一性測試 |
| <,<=,>,>=,!=,== | 比較 |
| | | 按位或 |
| ^ | 按位異或 |
| & | 按位與 |
| <<,>> | 移位 |
| +,- | 加法與減法 |
| *,/,% | 乘法、除法與取余 |
| +x,-x | 正負號 |
| ~x | 按位翻轉 |
| ** | 指數 |
| x.attribute | 屬性參考 |
| x[index] | 下標 |
| x[index:index] | 尋址段 |
| f(arguments...) | 函數調用 |
| (experession,...) | 綁定或元組顯示 |
| [expression,...] | 列表顯示 |
| {key:datum,...} | 字典顯示 |
| 'expression,...' | 字符串轉換 |
其中我們還沒有接觸過的運算符將在后面的章節(jié)中介紹。
在表中列在同一行的運算符具有 相同優(yōu)先級 。例如,+和-有相同的優(yōu)先級。
默認地,運算符優(yōu)先級表決定了哪個運算符在別的運算符之前計算。然而,如果你想要改變它們的計算順序,你得使用圓括號。例如,你想要在一個表達式中讓加法在乘法之前計算,那么你就得寫成類似(2 + 3) * 4的樣子。
運算符通常由左向右結合,即具有相同優(yōu)先級的運算符按照從左向右的順序計算。例如,2 + 3 + 4 被計算成(2 + 3) + 4。一些如賦值運算符那樣的運算符是由右向左結合的,即 a = b = c 被處理為 a = (b = c)。
例 5.1 使用表達式
#!/usr/bin/python
# Filename: expression.py
length = 5
breadth = 2
area = length * breadth
print 'Area is', area
print 'Perimeter is', 2 * (length + breadth)
(源文件:code/expression.py)
輸出
$ python expression.py
Area is 10
Perimeter is 14
它如何工作
矩形的長度與寬度存儲在以它們命名的變量中。我們借助表達式使用它們計算矩形的面積和邊長。我們表達式 length breadth 的結果存儲在變量 area 中,然后用 print 語句打印。在另一個打印語句中,我們直接使用表達式 2 (length + breadth)的值。
另外,注意 Python 如何打印“漂亮的”輸出。盡管我們沒有在'Area is'和變量 area 之間指定空格,Python 自動在那里放了一個空格,這樣我們就可以得到一個清晰漂亮的輸出,而程序也變得更加易讀(因為我們不需要擔心輸出之間的空格問題)。這是 Python 如何使程序員的生活變得更加輕松的一個例子。
我們已經學習了如何使用運算符、操作數和表達式——這些使任何程序的基本組成部分。接下來,我們將學習如何通過語句在我們的程序中使用這些部分。