### 5. 內建的類型
以下各節描述內置于解釋器的標準類型。
注
歷史上(直到2.2版的發布),Python 的內置類型不同于用戶定義的類型,因為不可能用內置類型作為面向對象繼承的基類。這種限制不再存在。
主要的內置類型為數字、 序列、 映射、 文件、 類、 實例和異常。
某些操作被幾種對象類型支持;特別需要注意的是,幾乎所有對象都可以比較、測試真值、轉換為字符串(其實就是用[*repr()*](#)函數,或略有差異的[str()](# "str")函數來轉換)。后者在對象使用[print()](# "print")函數寫出時隱式地調用。
### 5.1. 真值的測試
任何對象都可以測試真值,用于[if](#)或[while](#)的條件或下面布爾運算的操作數。下面的值被視為假:
-
None
-
False
-
任何數值類型的零,例如,0、 0 L、 0.0、 0j。
-
任何空的序列,例如, ''、 ()、 []。
-
任何空的映射,例如,{}。
-
用戶定義的類的實例,如果該類定義一個[__nonzero__()](# "object.__nonzero__")或[__len__()](# "object.__len__")的方法,在該方法返回整數零或[布爾](# "bool")值False時。[[1]](#)
所有其他值都被視為真 — 所以許多類型的對象永遠為真。
結果為布爾值的運算和內建函數總是返回0或False表示假以及1或True表示真,除非另有說明。(重要的例外:布爾操作符or和and始終返回它們的一個操作數。)
### 5.2. 布爾操作 — [and](#), [or](#), [not](#)
這些是布爾操作,按升序優先排序:
| 操作 | 結果 | 注 |
|-----|-----|-----|
| xory | 如果*x*為假,那么返回*y*,否則返回*x* | (1) |
| xandy | 如果*x*為假,那么返回*x*,否則返回*y* | (2) |
| notx | 如果*x*為假,那么返回True,否則返回False | (3) |
注:
1. 這是一個短路操作符,因此只有第一個參數為[False](# "False")時才計算第二個參數。
1. 這是一個短路操作符,因此只有第一個參數為[True](# "True")時才計算第二個參數。
1. not比非布爾操作符的優先級低,因此nota==b解釋為not(a==b),a==notb是一個語法錯誤。
### 5.3. 比較操作
所有對象都支持比較操作。它們都具有相同的優先級(高于布爾操作)。比較可以任意鏈接;例如,x<y< =z相當于x<yandy< =z,只是*y*只計算一次(但這兩種情況在x<y是假時都不會計算*z*)。
下表匯總了比較操作:
| 操作 | 含義 | 注 |
|-----|-----|-----|
| < | 嚴格地小于 | ? |
| <= | 小于或等于 | ? |
| > | 嚴格地大于 | ? |
| >= | 大于或等于 | ? |
| == | 等于 | ? |
| != | 不等于 | (1) |
| is | 對象的ID | ? |
| isnot | 不同的對象ID | ? |
注:
1. !=也可以寫成<>,但這只是用于保持向后兼容性的用法。新的代碼應該一直使用!=。
不同類型的對象,不同的數值和字符串類型除外,比較結果永遠不會相等;這類對象排序的結果永遠一致但是順序卻是隨機的(使得異構數組的排序可以生成一致的結果)。此外,某些類型(例如,文件對象)只支持退化的比較概念,該類型的任何兩個對象都不相等。同樣,這類對象排序的順序是隨機的但是會永遠是一致的。當任何一個操作數是復數時,<、 =、 >和> =運算符會引發[TypeError](# "exceptions.TypeError")異常。
類的非同一個實例比較時通常不相等,除非該類定義[__eq__()](# "object.__eq__")或[__cmp__()](# "object.__cmp__")方法。
一個類的實例通常不能與同一個類的其它實例或者其他類型的對象排序,除非該類定義足夠豐富的比較方法([__ge__()](# "object.__ge__")、[__le__()](# "object.__le__")、[__gt__()](# "object.__gt__")、[__lt__()](# "object.__lt__"))或[__cmp__()](# "object.__cmp__")方法。
**CPython 的實現細節:**除數值以外不同類型的對象按它們的類型名稱進行排序;不支持合適比較的相同類型的對象按它們的地址進行排序。
還有兩個具有相同優先級的操作in和notin只支持序列類型 (見下文)。
### 5.4. 數值類型 — [int](# "int"), [float](# "float"), [long](# "long"), [complex](# "complex")
有四種不同的數值類型:*普通整數*、*長整數*、*浮點數*和*復數*。此外,布爾值是普通整數的一個子類型。普通整數(也被只叫做*整數*)使用C中的long實現,其精度至少為32位(sys.maxint始終設置為當前平臺最大的普通整數值,最小值是-sys.maxint-1)。長整數具有無限的精度。浮點數字通常使用C中的double實現;有關你的程序所運行的機器上的浮點數精度及其內部表示形式的信息在[sys.float_info](# "sys.float_info")中可以獲得。復數有實部和虛部,各是一個浮點數。若要從復數*z*中提取這些部分,請使用z.real和z.imag。(標準庫包括額外的數值類型,[fractions](# "fractions: Rational numbers.")支持有理數,[decimal](# "decimal: Implementation of the General Decimal Arithmetic Specification.")支持用戶自定義精度的浮點數。)
數值通過數字字面值或內建的函數和操作的結果創建。普通的整數字面值(包括二進制、十六進制和八進制數字)產生普通整數,除非它們指定的值太大以致不能用一個普通的整數表示,在這種情況下它們產生一個長整型。帶有'L'或'l'后綴的整數字面值產生長整數(偏向使用'L',因為1l看起來太像十一)。包含小數點或指數符號的數字字面值產生浮點數。將'j'或'J'附加到數字字面值的尾部產生實部為零的復數。復數字面值是實部和虛部的和。
Python完全支持混合的算法:當二元算術運算符的操作數是不同的數值類型時,“較窄”類型的操作數會拓寬成另外一個操作數的類型,其中整數窄于長整數窄于浮點數窄于復數。比較混合型數字之間使用相同的規則。[[2]](#)構造函數[int()](# "int")、[long()](# "long")、[float()](# "float")和[complex()](# "complex")可用于產生的一種特定類型的數值。
所有內置的數值類型都支持以下操作。運算符的優先級請參閱[*冪運算符*](#)和后面幾節。
| 操作 | 結果 | 注 |
|-----|-----|-----|
| x+y | *x*與*y*和 | ? |
| x-y | *x*與*y*的差 | ? |
| x*y | *x*與*y*的積 | ? |
| x/y | *x*與*y*的商 | (1) |
| x//y | *x*與*y*的(整除)商 | (4)(5) |
| x%y | x/y的余數 | (4) |
| -x | 負*x* | ? |
| +x | *x*保持不變 | ? |
| abs(x) | *x*的絕對值或大小 | (3) |
| int(x) | *x*轉換成整數 | (2) |
| long(x) | *x*轉換成長整數 | (2) |
| float(x) | *x*轉換成浮點數 | (6) |
| complex(re,im) | 實部為*re*,虛部為*im*的一個復數。*im*默認為零。 | ? |
| c.conjugate() | 復數*c*的共軛。(用實數表示) | ? |
| divmod(x,y) | 元組(x//y,x%y) | (3)(4) |
| pow(x,y) | *x*的*y*次方 | (3)(7) |
| x**y | *x*的*y*次方 | (7) |
注:
1.
對于(普通或長)整數除法,結果是一個整數。結果總是向負無窮舍入:1/2是0,(-1)/2是-1,1/(-2)是-1,(-1)/(-2)是0。請注意如果任何一個操作數是長整數,結果都會是一個長整數,與值大小無關。
1.
使用[int()](# "int")或[long()](# "long")函數轉換浮點數會向零截斷,類似相關的函數[math.trunc()](# "math.trunc")函數。使用函數[math.floor()](# "math.floor")以向下取整和[math.ceil()](# "math.ceil")以向上取整。
1.
完整的說明請參閱[*內置函數*](#)。
1.
從2.3版開始棄用:整除運算符、取模運算符和[divmod()](# "divmod")函數不再為復數定義。相反,如果合適,可以使用[abs()](# "abs")函數轉換為浮點數。
1.
也被稱為整數除法。結果的值完全是一個整數,雖然結果的類型不一定是整型。
1.
浮點數還接受可帶有可選前綴 "+"或"-"的字符串"nan"和"inf"來表示非數字(NaN))和正/負無窮。
在2.6版中新增。
1.
Python定義pow(0,0)和0**0為1,這對于編程語言很常見。
所有的[numbers.](# "numbers.Real")Real類型([int](# "int")、[long](# "long")和[float](# "float"))還包含以下的操作:
| 操作 | 結果 | 注 |
|-----|-----|-----|
| math.trunc(x) | *x*截取成整數 | ? |
| round(x[,n]) | *x*舍入到n位,舍入ties away from零。如果n省略,默認為0。 | ? |
| math.floor(x) | <= *x*的最大浮點整數 | ? |
| math.ceil(x) | >= *x*的最小浮點整數 | ? |
- Python 2 教程
- 1. 吊吊你的胃口
- 2. Python 解釋器
- 3. Python簡介
- 4. 控制流
- 5. 數據結構
- 6. 模塊
- 7. 輸入和輸出
- 8. 錯誤和異常
- 9. 類
- 10. 標準庫概覽
- 11. 標準庫概覽 — 第II部分
- 12.現在怎么辦?
- 13. 交互式輸入的編輯和歷史記錄
- 14. 浮點數運算:問題和局限
- Python 2 標準庫
- 1. 引言
- 2. 內建函數
- 3. 不太重要的內建函數
- 4. 內建的常量
- 5. 內建的類型
- 6. 內建的異常
- 7. String Services
- 8. Data Types
- 9. Numeric and Mathematical Modules
- 10. File and Directory Access
- 11. Data Persistence
- 13. File Formats
- 14. Cryptographic Services
- 15. Generic Operating System Services
- 16. Optional Operating System Services
- 17. Interprocess Communication and Networking
- 18. Internet Data Handling
- 20. Internet Protocols and Support
- 26. Debugging and Profiling
- 28. Python Runtime Services
- Python 2 語言參考
- 1. 簡介
- 2. 詞法分析
- 3. 數據模型
- 4. 執行模型
- 5. 表達式
- 6. 簡單語句
- 7. 復合語句
- 8. 頂層的組件
- 9. 完整的語法規范
- Python 3 教程
- 1. 引言
- 2. Python 解釋器
- 3. Python簡介
- 4. 控制流
- 5. 數據結構
- 6. 模塊
- 7. 輸入和輸出
- 8. 錯誤和異常
- 9. 類
- 10. 標準庫概覽
- 11. 標準庫概覽 — 第II部分
- 12.現在怎么辦?
- 13. 交互式輸入的編輯和歷史記錄
- 14. 浮點數運算:問題和局限