內建型別

以下章節描述了直譯器中內建的標準型別。

主要內建型別為數字、序列、對映、class(類別)、實例和例外。

有些集合類別是 mutable(可變的)。那些用於原地 (in-place) 加入、移除或重新排列其成員且不回傳特定項的 method(方法),也只會回傳 None 而非集合實例自己。

某些操作已被多種物件型別支援;特別是實務上所有物件都已經可以做相等性比較、真值檢測及被轉換為字串(使用 repr() 函式或稍有差異的 str() 函式),後者為當物件傳入 print() 函式印出時在背後被呼叫的函式。

真值檢測

任何物件都可以進行檢測以判斷是否為真值,以便在 ifwhile 條件中使用,或是作為如下所述 boolean(布林)運算之運算元所用。

預設情況下,一個物件會被視為真值,除非它的 class 定義了會回傳 False__bool__() method 或是定義了會回傳零的 __len__() method。[1] 如果其中一個 method 在被呼叫時引發例外,該例外將會被傳播,且該物件不具有真值(例如 NotImplemented)。以下列出了大部分會被視為 false 的內建物件:

  • 定義為 false 之常數:NoneFalse

  • 任何數值型別的零:00.00jDecimal(0)Fraction(0, 1)

  • 空的序列和集合:''()[]{}set()range(0)

除非另有特別說明,產生 boolean 結果的操作或內建函式都會回傳 0False 作為假值、1True 作為真值。(重要例外: boolean 運算 orand 回傳的是其中一個運算元。)

Boolean(布林)運算 --- and, or, not

下方為 Boolean 運算,按優先順序排序:

運算

結果

註解

x or y

假如 x 為真,則 x,否則 y

(1)

x and y

假如 x 為假,則 x,否則 y

(2)

not x

假如 x 為假,則 True,否則 False

(3)

註解:

  1. 這是一個短路運算子,所以他只有在第一個引數為假時,才會對第二個引數求值。

  2. 這是一個短路運算子,所以他只有在第一個引數為真時,才會對第二個引數求值。

  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 皆不會被求值)。

這個表格統整所有比較運算:

運算

含義

<

小於

<=

小於等於

>

大於

>=

大於等於

==

等於

!=

不等於

is

物件識別性

is not

否定的物件識別性

除非有另外聲明,不同型別的物件不能進行相等比較。運算子 == 總有定義,但在某些物件型別(例如,class 物件)時,運算子會等同於 is。其他運算子 <<=>>= 皆僅在有意義的部分有所定義;例如,當其中一個引數為複數時,將引發一個 TypeError 的例外。

一個 class 的非相同實例通常會比較為不相等,除非 class 有定義 __eq__() method。

一個 class 的實例不可以與其他相同 class 的實例或其他物件型別進行排序,除非 class 定義足夠的 method ,包含 __lt__()__le__()__gt__()__ge__()(一般來說,使用 __lt__()__eq__() 就可以滿足常規意義上的比較運算子)。

無法自訂 isis not 運算子的行為;這兩個運算子也可以運用在任意兩個物件且不會引發例外。

此外,擁有相同的語法優先序的 innot in 兩種運算皆被可疊代物件或者有實作 __contains__() method 的型別所支援。

數值型別 --- intfloatcomplex

數值型別共有三種:整數浮點數複數。此外,Boolean 為整數中的一個子型別。整數有無限的精度。浮點數通常使用 C 裡面的 double 實作。關於在你程式所運作的機器上之浮點數的精度及內部表示法可以在 sys.float_info 進行查找。複數包含實數及虛數的部分,這兩部分各自是一個浮點數。若要從一個複數 z 提取這兩部分,需使用 z.realz.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

xy 的加總

x - y

xy 的相減

x * y

xy 的相乘

x / y

xy 相除之商

x // y

xy 的整數除法

(1)(2)

x % y

x / y 的餘數

(2)

-x

x 的負數

+x

x 不變

abs(x)

x 的絕對值或量 (magnitude)

abs()

int(x)

x 轉為整數

(3)(6)

int()

float(x)

x 轉為浮點數

(4)(6)

float()

complex(re, im)

一個複數,其實部為 re,虛部為 imim 預設為零。

(6)

complex()

c.conjugate()

為複數 c 的共軛複數

divmod(x, y)

一對 (x // y, x % y)

(2)

divmod()

pow(x, y)

xy 次方

(5)

pow()

x ** y

xy 次方

(5)

註解:

  1. 也被稱為整數除法。對於型別為 int 的運算元來說,結果之型別會是 int。對於型別為 float 的運算元來說,結果之型別會是 float。一般來說,結果會是一個整數,但其型別不一定會是 int。結果總是會往負無窮大的方向取整數值: 1//20(-1)//2-11//(-2)-1(-1)//(-2)0

  2. 不可用於複數。在適當情形下,可使用 abs() 轉換為浮點數。

  3. float 轉換為 int 會導致截斷並排除小數部分。詳見 math.floor()math.ceil() 以了解更多轉換方式。

  4. 浮點數也接受帶有可選的前綴 "+" 及 "-" 的 "nan" 及 "inf" 字串,其分別代表非數字(NaN)及正負無窮。

  5. Python 將 pow(0, 0)0 ** 0 定義為 1 這是程式語言的普遍做法。

  6. 字面數值接受包含數字 09 或任何等效的 Unicode 字元(具有 Nd 屬性的 code points(編碼位置))。

    請參閱 Unicode 標準以了解具有 Nd 屬性的 code points 完整列表。

所有 numbers.Real 型別(intfloat)也適用下列運算:

運算

結果

math.trunc(x)

x 截斷為 Integral

round(x[, n])

x 進位至小數點後第 n 位,使用偶數捨入法。若省略 n ,則預設為 0。

math.floor(x)

小於等於 x 的最大 Integral

math.ceil(x)

大於等於 x 的最小 Integral

關於其他數值運算請詳見 mathcmath modules(模組)。

整數型別的位元運算

位元運算只對整數有意義。位元運算的計算結果就如同對二的補數執行無窮多個符號位元。

二元位元運算的優先順序皆低於數字運算,但高於比較運算;一元運算 ~ 與其他一元數值運算有一致的優先順序(+-)。

這個表格列出所有位元運算並以優先順序由先至後排序。

運算

結果

註解

x | y

xy 的位元

(4)

x ^ y

xy 的位元 邏輯互斥或

(4)

x & y

xy 的位元

(4)

x << n

x 往左移動 n 個位元

(1)(2)

x >> n

x 往右移動 n 個位元

(1)(3)

~x

反轉 x 的位元

註解:

  1. 負數位移是不被允許並會引發 ValueError 的錯誤。

  2. 向左移動 n 個位元等同於乘以 pow(2, n)

  3. 向右移動 n 個位元等同於向下除法除以 pow(2, n)

  4. 在有限的二的補數表示法中執行這些計算(一個有效位元寬度為 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.