Python的運算物件、運算子、表示式和語句

veelion發表於2018-12-22

程式設計的本質就是資料和運算,資料由基本資料型別、資料結構來表示,運算就是對這些資料的各種操作,基本的加減乘除、是非判斷、流程控制等等。這些操作就是今天我們要講的運算子、表示式和語句。

python syntax

前面我們學習Python的基本語法時,講到了Python程式的的概念,這個行再細分就是運算子(Operators)、運算物件(Operands)、表示式(Express)、語句(Statements)。

提示:運算和操作這兩個概念在程式設計中往往是一樣的

比如下面這一行程式碼:

a = 5; b = a + 7; c = a if a > b else b

先來分解一下這一行:

  • 語句: 由表示式組成。此例共三條語句,用分號;分開,即一個物理行有三個邏輯行;
  • 表示式: 由運算子和操作物件組成。此例中的表示式有a + 7, a > b等;
  • 運算物件: 即各種物件。此例中的a, b, c, 5, 7等。

用一行表示它們的關係就是:

運算物件 + 運算子 -> 表示式 -> 語句

運算物件和運算子構成表示式,表示式構成語句

運算子和表示式

運算物件

運算物件就是由各種物件構成的集合,這些物件裡面有些是常量,有些是變數

常量

Python中的常量我們已經見過很多了,比如整數:9, 7, 8等等,浮點數:3.14, 0.618等等,字串:'猿人學Python',這些常量我們看到它們時就知道它們的意思,這就是字面意義上的常量。

字面意義上的常量就是按照它們的字面意義使用它們的值。比如,數字8總是代表它自己,它是一個常量,不能改變它的值。

變數

常量代表具有特定意義的物件,但不足以滿足程式設計的需要。程式設計經常需要一種既可以儲存資料有可以對它進行運算(操作)的東東,這個東東就是變數。程式設計中要經常使用變數,就需要給變數起個名字:變數名。變數名的起名規則就是前面講Python基本語法時提到的識別符號,忘了的小猿可以再去看看那一節。

最開始那一行Python程式碼中的a, b, c都是變數,而5, 12, 5就是它們各自儲存的值。如果再來一句a = a + 3a的值就變成了8,變數a的值就變了。
變數的賦值就是給變數一個值,比如a = 3,就是給a變數以3的值。

a = 3  # 把3賦值給a,此時a的值為3
b = a  # 把a賦值給b,此時b的值等於a的值,也是3
c, d = a, b  # 這是多重賦值,相當於 c = a; d = b

運算子

運算子就是對運算物件進行的具體運算名稱。不同的運算子代表不同的運算,比如加減乘除。
透過Python shell可以方便的體驗運算子的使用:

In [115]: 2 + 5
Out[115]: 7

In [116]: 8 * 9
Out[116]: 72

下面我們用一個表格來清晰的列出各種運算子及其用法。

運算子 名稱 含義 示例
+ 兩個物件相加 2 + 5得7; '猿人學' + 'Python'得到'猿人學Python'
- 兩數相減,或負數 10 - 5得到5;-3.1表示負數。
* 兩數相乘,或字串重複多次 3 * 7得到21;'py' * 2得到pypy
** 返回x的y次冪 2**8得256; 2.3**3得12.167
/ 兩數相除 10 / 2得到5;10 / 3 得到 3.333333
// 向下取整除 兩數相除,返回離商最近且小的整數。如果除數和被除數中有浮點數,返回的也是浮點數。 11 // 2得到5;-11 // 2得到-6;5 // 1.34得到3.0.
% 模除 求餘數 10 % 3得到1;10 % 3.3得到0.1;-10 % 3.3得到3.2,因為-10 // 3.3得 -4,-10 - 3.3*-4得到3.2.
<< 左移 二進位制操作,把數字的每個位元位向左移動特定位數(數字在記憶體中以二進位制0,1表示) 2 << 3得到16,2的二進位制是:00000010,左移3位變成:0b00010000即16
>> 右移 把一個數的位元位向右移動特定位數 2 >> 1得到1
& 位與 兩數對應的位元位進行與操作 8 & 9得8
| 位或 兩數對應的位元位進行或操作 8 | 9得9
^ 位異或 兩數對應的位元位進行異或操作 8^9得1
位反 一個數x的位元位全部取反,值為-(x+1) ~8的 -9
< 小於 返回x是否小於y。所有比較運算子返回的不是True就是False 8 < 9得到True
> 大於 返回x是否大於y 8 > 9得到False
<= 小於等於 返回x是否小於等於y x = 2; y = 3; x <= y 返回True
>= 大於等於 返回x是否大於等於y x = 6; y = 4; x >= y 返回True
== 等於 比較物件是否相等 2 == 2返回True3 == 2返回False'str' == 'str'返回True
!= 不等於比較物件是否不相等 1 != 3返回True3 != 3返回False
not 布林 如果x是True則返回False;如果x是False則返回True x = False; not x返回True
and 布林 x and y 如果x是False則返回False,否則返回y的布林值 x = False; y = True; x and y返回False,因為x是False。這種情況下,Python不再檢驗y的布林值,因為and左邊的x已經是False了,不管右邊的y是真是假都不影響整個表示式的值,所以就不再去驗證y是真是假。這叫做“短路求值”。
or 布林 如果x是True則返回True,否則返回y的布林值 x = True; y = False; x or y返回True。這裡同樣適用“短路求值”

運算子優先順序(Operator precedence)

小時候學數學的時候,我們知道先乘除後加減,比如要算2 + 5 * 6的話,先算5 * 6得到30, 再算2 + 30得到32. 也就是說,乘法運算子的優先順序高於加法運算子。

下面的表格就是Python的運算子的優先順序,從低到高排列,同一個單元格里面的運算子具有相同的優先順序,這時候運算順序從左到右。不過,還是建議大家透過使用圓括號來分組表示式(運算子和運算物件),這樣可以清楚的指出運算的先後順序,同時也讓程式更加易讀。

運算子 描述
lambda Lambda函式表示式
if-else 條件表示式
or 布林或
and 布林與
not 布林非
in, not in, is, is not, <, <=, >, >=, !=, == 比較,包括成員測試和同一性測試
| 位或
^ 位異或
& 位與
<<, >> 移位
+, - 加、減
*, @, /, //, % 乘,矩陣乘法,除,向下取整除,模除
+x, -x, ~x 整數,負數,位非(位反)
** 冪運算子。它的繫結不如其右側的算數或按位一元運算子緊密,所以,2**-1 的值是0.5.
await await表示式(asyncio中使用)
x[index], x[index:index], x(arguments...), x.attribute 下標,切片,函式呼叫,屬性引用
(expressions...), [expressions...], {key:value...}, {expressions...} 繫結或元組顯示,列表顯示,字典顯示,集合顯示

上面表格中有我們還沒有接觸到的運算子,這將會在後面的章節中講解。

程式根據上表的順序來進行運算,但是我們也可以透過圓括號來改變它們的計算順序,比如(2 + 7) * 3中,就先計算圓括號裡面的加法,然後再進行乘法。這個原則跟小學時學到的算術是一樣的。

表示式(Expression)

表示式是一段可以計算為某個值的語法片段。換句話說,就是表達元素的累積,比如文字,名稱,屬性訪問,運算子或函式呼叫,它們都返回一個值。與許多其它語言相比,並非所有語言結構都是表示式。還有一些語句不能用作表示式,比如while賦值也是語句,但不是表示式。

從上面對錶達式的定義來看,a > 3是表示式,a = 3不是表示式,而是賦值語句。

語句(Statements)

語句是程式段(一個程式碼“塊”)的組成單位。一條語句可以是一個表示式或某個帶有關鍵字的結構,例如if, whilefor
語句的例子:

a = 5  # 賦值語句
if a > 3:  #條件語句,其中 a > 3是表示式
    print('a > 3')  #輸出語句

總結

程式由語句組成;語句或是由表示式構成,或是賦值,或是if, while等關鍵字的結構;表示式由運算子和運算物件(數字、字串等常量,變數等)組成,是語句的構成元素。

練習

  1. 自己畫出數字的01位元位並進行<<, >>, &, |, ^, ~這些與操作,加深對二進位制的位操作的理解。
  2. 隨便寫段程式,用上運算子、運算物件、表示式和語句這些概念。

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章