內建型別¶
以下章節描述了直譯器中內建的標準型別。
主要內建型別為數字、序列、對映、class(類別)、實例和例外。
有些集合類別是 mutable(可變的)。那些用於原地 (in-place) 加入、移除或重新排列其成員且不回傳特定項的 method(方法),也只會回傳 None 而非集合實例自己。
某些操作已被多種物件型別支援;特別是實務上所有物件都已經可以做相等性比較、真值檢測及被轉換為字串(使用 repr() 函式或稍有差異的 str() 函式),後者為當物件傳入 print() 函式印出時在背後被呼叫的函式。
真值檢測¶
任何物件都可以進行檢測以判斷是否為真值,以便在 if 或 while 條件中使用,或是作為如下所述 boolean(布林)運算之運算元所用。
預設情況下,一個物件會被視為真值,除非它的 class 定義了會回傳 False 的 __bool__() method 或是定義了會回傳零的 __len__() method。[1] 如果其中一個 method 在被呼叫時引發例外,該例外將會被傳播,且該物件不具有真值(例如 NotImplemented)。以下列出了大部分會被視為 false 的內建物件:
定義為 false 之常數:
None與False任何數值型別的零:
0、0.0、0j、Decimal(0)、Fraction(0, 1)空的序列和集合:
''、()、[]、{}、set()、range(0)
除非另有特別說明,產生 boolean 結果的操作或內建函式都會回傳 0 或 False 作為假值、1 或 True 作為真值。(重要例外: boolean 運算 or 和 and 回傳的是其中一個運算元。)
Boolean(布林)運算 --- and, or, not¶
下方為 Boolean 運算,按優先順序排序:
運算 |
結果 |
註解 |
|---|---|---|
|
假如 x 為真,則 x,否則 y |
(1) |
|
假如 x 為假,則 x,否則 y |
(2) |
|
假如 x 為假,則 |
(3) |
註解:
這是一個短路運算子,所以他只有在第一個引數為假時,才會對第二個引數求值。
這是一個短路運算子,所以他只有在第一個引數為真時,才會對第二個引數求值。
not比非 Boolean 運算子有較低的優先權,因此not a == b可直譯為not (a == b),而a == not b會導致語法錯誤。
比較運算¶
在 Python 裡共有 8 種比較運算。他們的優先順序都相同(皆優先於 Boolean 運算)。比較運算可以任意的串連;例如,x < y <= z 等同於 x < y and y <= z,差異只在於前者的 y 只有被求值一次(但在這兩個例子中,當 x < y 為假時,z 皆不會被求值)。
這個表格統整所有比較運算:
運算 |
含義 |
|---|---|
|
小於 |
|
小於等於 |
|
大於 |
|
大於等於 |
|
等於 |
|
不等於 |
|
物件識別性 |
|
否定的物件識別性 |
除非有另外聲明,不同型別的物件不能進行相等比較。運算子 == 總有定義,但在某些物件型別(例如,class 物件)時,運算子會等同於 is。其他運算子 <、<=、> 及 >= 皆僅在有意義的部分有所定義;例如,當其中一個引數為複數時,將引發一個 TypeError 的例外。
一個 class 的非相同實例通常會比較為不相等,除非 class 有定義 __eq__() method。
一個 class 的實例不可以與其他相同 class 的實例或其他物件型別進行排序,除非 class 定義足夠的 method ,包含 __lt__()、__le__()、__gt__() 及 __ge__()(一般來說,使用 __lt__() 及 __eq__() 就可以滿足常規意義上的比較運算子)。
無法自訂 is 與 is not 運算子的行為;這兩個運算子也可以運用在任意兩個物件且不會引發例外。
此外,擁有相同的語法優先序的 in 及 not in 兩種運算皆被可疊代物件或者有實作 __contains__() method 的型別所支援。
數值型別 --- int、float、complex¶
數值型別共有三種:整數、浮點數 及 複數。此外,Boolean 為整數中的一個子型別。整數有無限的精度。浮點數通常使用 C 裡面的 double 實作。關於在你程式所運作的機器上之浮點數的精度及內部表示法可以在 sys.float_info 進行查找。複數包含實數及虛數的部分,這兩部分各自是一個浮點數。若要從一個複數 z 提取這兩部分,需使用 z.real 及 z.imag。(標準函式庫包含額外的數值型別,像是 fractions.Fraction 表示有理數,而 decimal.Decimal 表示可由使用者制定精度的浮點數。)
數字是由字面數值或內建公式及運算子的結果所產生的。未經修飾的字面數值(含十六進位、八進位及二進位數值)會 yield 整數。包含小數點或指數符號的字面數值會 yield 浮點數。在數值後面加上 'j' 或是 'J' 會 yield 一個虛數(意即一個實數為 0 的複數)。你也可以將整數與浮點數相加以得到一個有實部與虛部的複數。
建構函式: int()、float() 及 complex() 可以用來產生特定型別的數字。
Python 完全支援混和運算:當一個二元運算子的運算元有不同內建數值型別時,「較窄」型別的運算元會被拓寬到另一個型別的運算元:
If both arguments are complex numbers, no conversion is performed;
if either argument is a complex or a floating-point number, the other is converted to a floating-point number;
otherwise, both must be integers and no conversion is necessary.
Arithmetic with complex and real operands is defined by the usual mathematical formula, for example:
x + complex(u, v) = complex(x + u, v)
x * complex(u, v) = complex(x * u, x * v)
不同型別的數值之間進行比較時,其行為就像是在比較這些數值的實際值 [2]
所有數值型別(除複數外)皆支援以下的運算(有關運算的先後順序,詳見 Operator precedence):
運算 |
|---|