內建型別¶
以下章節描述了直譯器中內建的標準型別。
主要內建型別為數字、序列、對映、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):
運算 |
結果 |
註解 |
完整文件 |
|---|---|---|---|
|
x 及 y 的加總 |
||
|
x 及 y 的相減 |
||
|
x 及 y 的相乘 |
||
|
x 及 y 相除之商 |
||
|
x 及 y 的整數除法 |
(1)(2) |
|
|
|
(2) |
|
|
x 的負數 |
||
|
x 不變 |
||
|
x 的絕對值或量 (magnitude) |
||
|
將 x 轉為整數 |
(3)(6) |
|
|
將 x 轉為浮點數 |
(4)(6) |
|
|
一個複數,其實部為 re,虛部為 im。im 預設為零。 |
(6) |
|
|
為複數 c 的共軛複數 |
||
|
一對 |
(2) |
|
|
x 的 y 次方 |
(5) |
|
|
x 的 y 次方 |
(5) |
註解:
也被稱為整數除法。對於型別為
int的運算元來說,結果之型別會是int。對於型別為float的運算元來說,結果之型別會是float。一般來說,結果會是一個整數,但其型別不一定會是int。結果總是會往負無窮大的方向取整數值:1//2為0、(-1)//2為-1、1//(-2)為-1及(-1)//(-2)為0。不可用於複數。在適當情形下,可使用
abs()轉換為浮點數。從
float轉換為int會導致截斷並排除小數部分。詳見math.floor()及math.ceil()以了解更多轉換方式。浮點數也接受帶有可選的前綴 "+" 及 "-" 的 "nan" 及 "inf" 字串,其分別代表非數字(NaN)及正負無窮。
Python 將
pow(0, 0)及0 ** 0定義為1這是程式語言的普遍做法。字面數值接受包含數字
0到9或任何等效的 Unicode 字元(具有Nd屬性的 code points(編碼位置))。請參閱 Unicode 標準以了解具有
Nd屬性的 code points 完整列表。
所有 numbers.Real 型別(int 及 float)也適用下列運算:
運算 |
結果 |
|---|---|
x 截斷為 |
|
x 進位至小數點後第 n 位,使用偶數捨入法。若省略 n ,則預設為 0。 |
|
小於等於 x 的最大 |
|
大於等於 x 的最小 |
關於其他數值運算請詳見 math 及 cmath modules(模組)。
整數型別的位元運算¶
位元運算只對整數有意義。位元運算的計算結果就如同對二的補數執行無窮多個符號位元。
二元位元運算的優先順序皆低於數字運算,但高於比較運算;一元運算 ~ 與其他一元數值運算有一致的優先順序(+ 及 -)。
這個表格列出所有位元運算並以優先順序由先至後排序。
運算 |
結果 |
註解 |
|---|---|---|
|
x 及 y 的位元 或 |
(4) |
|
x 及 y 的位元 邏輯互斥或 |
(4) |
|
x 及 y 的位元 與 |
(4) |
|
x 往左移動 n 個位元 |
(1)(2) |
|
x 往右移動 n 個位元 |
(1)(3) |
|
反轉 x 的位元 |
註解:
負數位移是不被允許並會引發
ValueError的錯誤。向左移動 n 個位元等同於乘以
pow(2, n)。向右移動 n 個位元等同於向下除法除以
pow(2, n)。在有限的二的補數表示法中執行這些計算(一個有效位元寬度為
1 + max(x.bit_length(), y.bit_length())或以上)並至少有一個額外的符號擴展位元,便足以得到與無窮多個符號位元相同的結果。
整數型別的附加方法¶
整數型別實作了 numbers.Integral 抽象基底類別。此外,它提供了一些方法:
- int.bit_length()¶
回傳以二進位表示一個整數所需要的位元數,不包括符號及首位的零:
>>> n = -37 >>> bin(n) '-0b100101' >>> n.bit_length() 6
更準確來說,若
x非為零,則x.bit_length()會得出滿足2**(k-1) <= abs(x) < 2**k的單一正整數k。同樣地,當abs(x)足夠小到能正確地取得捨入的對數,則k = 1 + int(log(abs(x), 2))。若x為零,則x.bit_length()會回傳0。等同於:
def bit_length(self): s = bin(self) # binary representation: bin(-37) --> '-0b100101' s = s.lstrip('-0b') # remove leading zeros and minus sign return len(s) # len('100101') --> 6
在 3.1 版被加入.
- int.bit_count()¶
回傳在絕對值表示的二進位中 1 的個數。這也被稱作母體計數。舉例來說:
>>> n = 19 >>> bin(n) '0b10011' >>> n.bit_count() 3 >>> (-n).bit_count() 3
等同於:
def bit_count(self): return bin(self).count("1")
在 3.10 版被加入.
- int.to_bytes(length=1, byteorder='big', *, signed=False)¶
回傳表示一個整數的一列位元組。
>>> (1024).to_bytes(2, byteorder='big') b'\x04\x00' >>> (1024).to_bytes(10, byteorder='big') b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' >>> (-1024).to_bytes(10, byteorder='big', signed=True) b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00' >>> x = 1000 >>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little') b'\xe8\x03'
此整數會使用 length 位元組表示,並且預設為 1。如果該整數無法用給定的位元組數來表示,則會引發
OverflowError。byteorder 引數決定了用來表示整數的位元組順序並且預設為
"big"。如果 byteorder 是"big",最重要的位元組位於位元組陣列的開頭。如果 byteorder 是"little",最重要的位元組位於位元組陣列的結尾。signed 引數決定是否使用二的補數來表示整數。如果 signed 是
False並且給定了一個負整數,則會引發OverflowError。signed 的預設值是False。預設值可以方便地將一個整數轉換為單一位元組物件:
>>> (65).to_bytes() b'A'
然而,使用預設引數時,不要嘗試轉換大於 255 的值,否則你將會得到一個
OverflowError。等同於:
def to_bytes(n, length=1, byteorder='big', signed=False): if byteorder == 'little': order = range(length) elif byteorder == 'big': order = reversed(range(length)) else: raise ValueError("byteorder must be either 'little' or 'big'") return bytes((n >> i*8) & 0xff for i in order)
在 3.2 版被加入.
在 3.11 版的變更: 為
length和byteorder添加了預設引數值。
- classmethod int.from_bytes(bytes, byteorder='big', *, signed=False)¶
回傳由給定的位元組陣列表示的整數。
>>> int.from_bytes(b'\x00\x10', byteorder='big') 16 >>> int.from_bytes(b'\x00\x10', byteorder='little') 4096 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True) -1024 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False) 64512 >>> int.from_bytes([255, 0, 0], byteorder='big') 16711680
引數 bytes 必須是一個類位元組物件或是一個產生位元組的可疊代物件。
byteorder 引數決定了用來表示整數的位元組順序並且預設為
"big"。如果 byteorder 是"big",最重要的位元組位於位元組陣列的開頭。如果 byteorder 是"little",最重要的位元組位於位元組陣列的結尾。若要請求主機系統的本機位元組順序,請使用sys.byteorder作為位元組順序值。signed 引數指示是否使用二的補數來表示整數。
等同於:
def from_bytes(bytes, byteorder='big', signed=False): if byteorder == 'little': little_ordered = list(bytes) elif byteorder == 'big': little_ordered = list(reversed(bytes)) else: raise ValueError("byteorder must be either 'little' or 'big'") n = sum(b << i*8 for i, b in enumerate(little_ordered)) if signed and little_ordered and (little_ordered[-1] & 0x80): n -= 1 << 8*len(little_ordered) return n
在 3.2 版被加入.
在 3.11 版的變更: 為
byteorder添加了預設引數值。
- int.as_integer_ratio()¶
回傳一對整數,其比率等於原始整數並且有一個正分母。整數(整個數值)的整數比率總是整數作為分子,並且
1作為分母。在 3.8 版被加入.
- int.is_integer()¶
回傳
True。為了與float.is_integer()的鴨子型別相容而存在。在 3.12 版被加入.
浮點數的附加方法¶
浮點數型別實作了