### 導航
- [索引](../genindex.xhtml "總目錄")
- [模塊](../py-modindex.xhtml "Python 模塊索引") |
- [下一頁](exceptions.xhtml "內置異常") |
- [上一頁](constants.xhtml "內置常量") |
- 
- [Python](https://www.python.org/) ?
- zh\_CN 3.7.3 [文檔](../index.xhtml) ?
- [Python 標準庫](index.xhtml) ?
- $('.inline-search').show(0); |
# 內置類型
以下部分描述了解釋器中內置的標準類型。
主要內置類型有數字、序列、映射、類、實例和異常。
有些多項集類是可變的。 它們用于添加、移除或重排其成員的方法將原地執行,并不返回特定的項,絕對不會返回多項集實例自身而是返回 `None`。
有些操作受多種對象類型的支持;特別地,實際上所有對象都可以被比較、檢測邏輯值,以及轉換為字符串(使用 [`repr()`](functions.xhtml#repr "repr") 函數或略有差異的 [`str()`](#str "str") 函數)。 后一個函數是在對象由 [`print()`](functions.xhtml#print "print") 函數輸出時被隱式地調用的。
## 邏輯值檢測
任何對象都可以進行邏輯值的檢測,以便在 [`if`](../reference/compound_stmts.xhtml#if) 或 [`while`](../reference/compound_stmts.xhtml#while) 作為條件或是作為下文所述布爾運算的操作數來使用。
一個對象在默認情況下均被視為真值,除非當該對象被調用時其所屬類定義了 [`__bool__()`](../reference/datamodel.xhtml#object.__bool__ "object.__bool__") 方法且返回 `False` 或是定義了 [`__len__()`](../reference/datamodel.xhtml#object.__len__ "object.__len__") 方法且返回零。 [1](#id12) 下面基本完整地列出了會被視為假值的內置對象:
>
- 被定義為假值的常量: `None` 和 `False`。
- 任何數值類型的零: `0`, `0.0`, `0j`, `Decimal(0)`, `Fraction(0, 1)`
- 空的序列和多項集: `''`, `()`, `[]`, `{}`, `set()`, `range(0)`
產生布爾值結果的運算和內置函數總是返回 `0` 或 `False` 作為假值,`1` 或 `True` 作為真值,除非另行說明。 (重要例外:布爾運算 `or` 和 `and` 總是返回其中一個操作數。)
## 布爾運算 --- `and`, `or`, `not`
這些屬于布爾運算,按優先級升序排列:
運算
結果
注釋
`x or y`
if *x* is false, then *y*, else *x*
(1)
`x and y`
if *x* is false, then *x*, else *y*
(2)
`not x`
if *x* is false, then `True`, else `False`
(3)
注釋:
1. 這是個短路運算符,因此只有在第一個參數為假值時才會對第二個參數求值。
2. 這是個短路運算符,因此只有在第一個參數為真值時才會對第二個參數求值。
3. `not` 的優先級比非布爾運算符低,因此 `not a == b` 會被解讀為 `not (a == b)` 而 `a == not b` 會引發語法錯誤。
## 比較
在 Python 中有八種比較運算符。 它們的優先級相同(比布爾運算的優先級高)。 比較運算可以任意串連;例如,`x < y <= z` 等價于 `x < y and y <= z`,前者的不同之處在于 *y* 只被求值一次(但在兩種情況下當 `x < y` 結果為假值時 *z* 都不會被求值)。
此表格匯總了比較運算:
運算
含義
`<`
嚴格小于
`<=`
小于或等于
`>`
嚴格大于
`>=`
大于或等于
`==`
等于
`!=`
不等于
`is`
對象標識
`is not`
否定的對象標識
除了不同數字類型以外,不同類型的對象比較時絕對不會相等。 而且,某些類型(例如函數對象)僅支持簡化比較形式,即任何兩個該種類型的對象必定不相等。 `<`, `<=`, `>` 和 `>=` 運算符在以下情況中將引發 [`TypeError`](exceptions.xhtml#TypeError "TypeError") 異常:當比較復數與另一個內置數字類型時,當兩個對象具有無法被比較的不同類型時,或在未定義次序的其他情況時。
具有不同標識的類的實例比較結果通常為不相等,除非類定義了 [`__eq__()`](../reference/datamodel.xhtml#object.__eq__ "object.__eq__") 方法。
一個類實例不能與相同類或的其他實例或其他類型的對象進行排序,除非該類定義了足夠多的方法,包括 [`__lt__()`](../reference/datamodel.xhtml#object.__lt__ "object.__lt__"), [`__le__()`](../reference/datamodel.xhtml#object.__le__ "object.__le__"), [`__gt__()`](../reference/datamodel.xhtml#object.__gt__ "object.__gt__") 以及 [`__ge__()`](../reference/datamodel.xhtml#object.__ge__ "object.__ge__") (而如果你想實現常規意義上的比較操作,通常只要有 [`__lt__()`](../reference/datamodel.xhtml#object.__lt__ "object.__lt__") 和 [`__eq__()`](../reference/datamodel.xhtml#object.__eq__ "object.__eq__") 就可以了)。
[`is`](../reference/expressions.xhtml#is) 和 [`is not`](../reference/expressions.xhtml#is-not) 運算符無法自定義;并且它們可以被應用于任意兩個對象而不會引發異常。
還有兩種具有相同語法優先級的運算 [`in`](../reference/expressions.xhtml#in) 和 [`not in`](../reference/expressions.xhtml#not-in),它們被 [iterable](../glossary.xhtml#term-iterable) 或實現了 [`__contains__()`](../reference/datamodel.xhtml#object.__contains__ "object.__contains__") 方法的類型所支持。
## 數字類型 --- [`int`](functions.xhtml#int "int"), [`float`](functions.xhtml#float "float"), [`complex`](functions.xhtml#complex "complex")
存在三種不同的數字類型: *整數*, *浮點數* 和 *復數*。 此外,布爾值屬于整數的子類型。 整數具有無限的精度。 浮點數通常使用 C 中的 `double` 來實現;有關你的程序運行所在機器上浮點數的精度和內部表示法可在 [`sys.float_info`](sys.xhtml#sys.float_info "sys.float_info") 中查看。 復數包含實部和虛部,分別以一個浮點數表示。 要從一個復數 *z* 中提取這兩個部分,可使用 `z.real` 和 `z.imag`。 (標準庫包含附加的數字類型,如表示有理數的 [`fractions`](fractions.xhtml#module-fractions "fractions: Rational numbers.") 以及以用戶定制精度表示浮點數的 [`decimal`](decimal.xhtml#module-decimal "decimal: Implementation of the General Decimal Arithmetic Specification.")。)
數字是由數字字面值或內置函數與運算符的結果來創建的。 不帶修飾的整數字面值(包括十六進制、八進制和二進制數)會生成整數。 包含小數點或冪運算符的數字字面值會生成浮點數。 在數字字面值末尾加上 `'j'` 或 `'J'` 會生成虛數(實部為零的復數),你可以將其與整數或浮點數相加來得到具有實部和虛部的復數。
Python 完全支持混合算術:當一個二元運算符用于不同數字類型的操作數時,具有“較窄” 類型的操作數會被擴展為另一個操作數的類型,整數比浮點數更窄,浮點數又比復數更窄。 混合類型數字之間的比較也使用相同的規則。 [2](#id13) 構造器 [`int()`](functions.xhtml#int "int"), [`float()`](functions.xhtml#float "float") 和 [`complex()`](functions.xhtml#complex "complex") 可被用于生成特定類型的數字。
所有數字類型(復數除外)都支持下列運算,按優先級升序排序(所有數字運算的優先級都高于比較運算):
運算
結果
注釋
完整文檔
`x + y`
*x* 和 *y* 的和
`x - y`
*x* 和 *y* 的差
`x * y`
*x* 和 *y* 的乘積
`x / y`
*x* 和 *y* 的商
`x // y`
*x* 和 *y* 的商數
(1)
`x % y`
remainder of `x / y`
(2)
`-x`
*x* 取反
`+x`
*x* 不變
`abs(x)`
*x* 的絕對值或大小
[`abs()`](functions.xhtml#abs "abs")
`int(x)`
將 *x* 轉換為整數
(3)(6)
[`int()`](functions.xhtml#int "int")
`float(x)`
將 *x* 轉換為浮點數
(4)(6)
[`float()`](functions.xhtml#float "float")
`complex(re, im)`
一個帶有實部 *re* 和虛部 *im* 的復數。*im* 默認為0。
(6)
[`complex()`](functions.xhtml#complex "complex")
`c.conjugate()`
復數 *c* 的共軛
`divmod(x, y)`
`(x // y, x % y)`
(2)
[`divmod()`](functions.xhtml#divmod "divmod")
`pow(x, y)`
*x* 的 *y* 次冪
(5)
[`pow()`](functions.xhtml#pow "pow")
`x ** y`
*x* 的 *y* 次冪
(5)
注釋:
1. 也稱為整數除法。 結果值是一個整數,但結果的類型不一定是 int。 運算結果總是向負無窮的方向舍入: `1//2` 為 `0`, `(-1)//2` 為 `-1`, `1//(-2)` 為 `-1` 而 `(-1)//(-2)` 為 `0`。
2. 不可用于復數。 而應在適當條件下使用 [`abs()`](functions.xhtml#abs "abs") 轉換為浮點數。
3. 從浮點數轉換為整數會被舍入或是像在 C 語言中一樣被截斷;請參閱 [`math.floor()`](math.xhtml#math.floor "math.floor") 和 [`math.ceil()`](math.xhtml#math.ceil "math.ceil") 函數查看轉換的完整定義。
4. float 也接受字符串 "nan" 和附帶可選前綴 "+" 或 "-" 的 "inf" 分別表示非數字 (NaN) 以及正或負無窮。
5. Python 將 `pow(0, 0)` 和 `0 ** 0` 定義為 `1`,這是編程語言的普遍做法。
6. 接受的數字字面值包括數碼 `0` 到 `9` 或任何等效的 Unicode 字符(具有 `Nd` 特征屬性的代碼點)。
請參閱 <http://www.unicode.org/Public/10.0.0/ucd/extracted/DerivedNumericType.txt> 查看具有 `Nd` 特征屬性的代碼點的完整列表。
所有 [`numbers.Real`](numbers.xhtml#numbers.Real "numbers.Real") 類型 ([`int`](functions.xhtml#int "int") 和 [`float`](functions.xhtml#float "float")) 還包括下列運算:
運算
結果
[`math.trunc(x)`](math.xhtml#math.trunc "math.trunc")
*x* 截斷為 [`Integral`](numbers.xhtml#numbers.Integral "numbers.Integral")
[```
round(x[,
n])
```](functions.xhtml#round "round")
*x* 舍入到 *n* 位小數,半數值會舍入到偶數。 如果省略 *n*,則默認為 0。
[`math.floor(x)`](math.xhtml#math.floor "math.floor")
<= *x* 的最大 [`Integral`](numbers.xhtml#numbers.Integral "numbers.Integral")
[`math.ceil(x)`](math.xhtml#math.ceil "math.ceil")
\>= *x* 的最小 [`Integral`](numbers.xhtml#numbers.Integral "numbers.Integral")
有關更多的數字運算請參閱 [`math`](math.xhtml#module-math "math: Mathematical functions (sin() etc.).") 和 [`cmath`](cmath.xhtml#module-cmath "cmath: Mathematical functions for complex numbers.") 模塊。
### 整數類型的按位運算
按位運算只對整數有意義。 計算按位運算的結果,就相當于使用無窮多個二進制符號位對二的補碼執行操作。
二進制按位運算的優先級全都低于數字運算,但又高于比較運算;一元運算 `~` 具有與其他一元算術運算 (`+` and `-`) 相同的優先級。
此表格是以優先級升序排序的按位運算列表:
運算
結果
注釋
`x | y`
*x* 和 *y* 按位 *或*
(4)
`x ^ y`
*x* 和 *y* 按位 *異或*
(4)
`x & y`
*x* 和 *y* 按位 *與*
(4)
`x << n`
*x* 左移 *n* 位
(1)(2)
`x >> n`
*x* 右移 *n* 位
(1)(3)
`~x`
*x* 逐位取反
注釋:
1. 負的移位數是非法的,會導致引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError")。
2. 左移 *n* 位等價于不帶溢出檢測地乘以 `pow(2, n)`。
3. 右移 *n* 位等價于不帶溢出檢測地除以 `pow(2, n)`。
4. 使用帶有至少一個額外符號擴展位的有限個二進制補碼表示(有效位寬度為 `1 + max(x.bit_length(), y.bit_length())` 或以上)執行這些計算就足以獲得相當于有無數個符號位時的同樣結果。
### 整數類型的附加方法
int 類型實現了 [`numbers.Integral`](numbers.xhtml#numbers.Integral "numbers.Integral") [abstract base class](../glossary.xhtml#term-abstract-base-class)。 此外,它還提供了其他幾個方法:
`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.``to_bytes`(*length*, *byteorder*, *\**, *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* 個字節來表示。 如果整數不能用給定的字節數來表示則會引發 [`OverflowError`](exceptions.xhtml#OverflowError "OverflowError")。
*byteorder* 參數確定用于表示整數的字節順序。 如果 *byteorder* 為 `"big"`,則最高位字節放在字節數組的開頭。 如果 *byteorder* 為 `"little"`,則最高位字節放在字節數組的末尾。 要請求主機系統上的原生字節順序,請使用 [`sys.byteorder`](sys.xhtml#sys.byteorder "sys.byteorder") 作為字節順序值。
*signed* 參數確定是否使用二的補碼來表示整數。 如果 *signed* 為 `False` 并且給出的是負整數,則會引發 [`OverflowError`](exceptions.xhtml#OverflowError "OverflowError")。 *signed* 的默認值為 `False`。
3\.2 新版功能.
*classmethod* `int.``from_bytes`(*bytes*, *byteorder*, *\**, *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* 參數必須為一個 [bytes-like object](../glossary.xhtml#term-bytes-like-object) 或是生成字節的可迭代對象。
*byteorder* 參數確定用于表示整數的字節順序。 如果 *byteorder* 為 `"big"`,則最高位字節放在字節數組的開頭。 如果 *byteorder* 為 `"little"`,則最高位字節放在字節數組的末尾。 要請求主機系統上的原生字節順序,請使用 [`sys.byteorder`](sys.xhtml#sys.byteorder "sys.byteorder") 作為字節順序值。
*signed* 參數指明是否使用二的補碼來表示整數。
3\.2 新版功能.
### 浮點類型的附加方法
float 類型實現了 [`numbers.Real`](numbers.xhtml#numbers.Real "numbers.Real") [abstract base class](../glossary.xhtml#term-abstract-base-class)。 float 還具有以下附加方法。
`float.``as_integer_ratio`()返回一對整數,其比率正好等于原浮點數并且分母為正數。 無窮大會引發 [`OverflowError`](exceptions.xhtml#OverflowError "OverflowError") 而 NaN 則會引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError")。
`float.``is_integer`()如果 float 實例可用有限位整數表示則返回 `True`,否則返回 `False`:
```
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False
```
兩個方法均支持與十六進制數字符串之間的轉換。 由于 Python 浮點數在內部存儲為二進制數,因此浮點數與 *十進制數* 字符串之間的轉換往往會導致微小的舍入錯誤。 而十六進制數字符串卻允許精確地表示和描述浮點數。 這在進行調試和數值工作時非常有用。
`float.``hex`()以十六進制字符串的形式返回一個浮點數表示。 對于有限浮點數,這種表示法將總是包含前導的 `0x` 和尾隨的 `p` 加指數。
*classmethod* `float.``fromhex`(*s*)返回以十六進制字符串 *s* 表示的浮點數的類方法。 字符串 *s* 可以帶有前導和尾隨的空格。
請注意 [`float.hex()`](#float.hex "float.hex") 是實例方法,而 [`float.fromhex()`](#float.fromhex "float.fromhex") 是類方法。
十六進制字符串采用的形式為:
```
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
```
可選的 `sign` 可以是 `+` 或 `-`,`integer` 和 `fraction` 是十六進制數碼組成的字符串,`exponent` 是帶有可選前導符的十進制整數。 大小寫沒有影響,在 integer 或 fraction 中必須至少有一個十六進制數碼。 此語法類似于 C99 標準的 6.4.4.2 小節中所描述的語法,也是 Java 1.5 以上所使用的語法。 特別地,[`float.hex()`](#float.hex "float.hex") 的輸出可以用作 C 或 Java 代碼中的十六進制浮點數字面值,而由 C 的 `%a` 格式字符或 Java 的 `Double.toHexString` 所生成的十六進制數字符串由為 [`float.fromhex()`](#float.fromhex "float.fromhex") 所接受。
請注意 exponent 是十進制數而非十六進制數,它給出要與系數相乘的 2 的冪次。 例如,十六進制數字符串 `0x3.a7p10` 表示浮點數 `(3 + 10./16 + 7./16**2) * 2.0**10` 即 `3740.0`:
```
>>> float.fromhex('0x3.a7p10')
3740.0
```
對 `3740.0` 應用反向轉換會得到另一個代表相同數值的十六進制數字符串:
```
>>> float.hex(3740.0)
'0x1.d380000000000p+11'
```
### 數字類型的哈希運算
對于可能為不同類型的數字 `x` 和 `y`,要求 `x == y` 時必定 `hash(x) == hash(y)` (詳情參見 [`__hash__()`](../reference/datamodel.xhtml#object.__hash__ "object.__hash__") 方法的文檔)。 為了便于在各種數字類型 (包括 [`int`](functions.xhtml#int "int"), [`float`](functions.xhtml#float "float"), [`decimal.Decimal`](decimal.xhtml#decimal.Decimal "decimal.Decimal") 和 [`fractions.Fraction`](fractions.xhtml#fractions.Fraction "fractions.Fraction")) 上實現并保證效率,Python 對數字類型的哈希運算是基于為任意有理數定義統一的數學函數,因此該運算對 [`int`](functions.xhtml#int "int") 和 [`fractions.Fraction`](fractions.xhtml#fractions.Fraction "fractions.Fraction") 的全部實例,以及 [`float`](functions.xhtml#float "float") 和 [`decimal.Decimal`](decimal.xhtml#decimal.Decimal "decimal.Decimal") 的全部有限實例均可用。 從本質上說,此函數是通過以一個固定質數 `P` 進行 `P` 降模給出的。 `P` 的值在 Python 中可以 [`sys.hash_info`](sys.xhtml#sys.hash_info "sys.hash_info") 的 `modulus` 屬性的形式被訪問。
**CPython implementation detail:** 目前所用的質數設定,在 C long 為 32 位的機器上 `P = 2**31 - 1` 而在 C long 為 64 位的機器上 `P = 2**61 - 1`。
詳細規則如下所述:
- 如果 `x = m / n` 是一個非負的有理數且 `n` 不可被 `P` 整除,則定義 `hash(x)` 為 `m * invmod(n, P) % P`,其中 `invmod(n, P)` 是對 `n` 模 `P` 取反。
- 如果 `x = m / n` 是一個非負的有理數且 `n` 可被 `P` 整除(但 `m` 不能)則 `n` 不能對 `P` 降模,以上規則不適用;在此情況下則定義 `hash(x)` 為常數值 `sys.hash_info.inf`。
- 如果 `x = m / n` 是一個負的有理數則定義 `hash(x)` 為 `-hash(-x)`。 如果結果哈希值為 `-1` 則將其替換為 `-2`。
- 特定值 `sys.hash_info.inf`, `-sys.hash_info.inf` 和 `sys.hash_info.nan` 被用作正無窮、負無窮和空值(所分別對應的)哈希值。 (所有可哈希的空值都具有相同的哈希值。)
- 對于一個 [`complex`](functions.xhtml#complex "complex") 值 `z`,會通過計算 `hash(z.real) + sys.hash_info.imag * hash(z.imag)` 將實部和虛部的哈希值結合起來,并進行降模 `2**sys.hash_info.width` 以使其處于 `range(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1))` 范圍之內。 同樣地,如果結果為 `-1` 則將其替換為 `-2`。
為了闡明上述規則,這里有一些等價于內置哈希算法的 Python 代碼示例,可用于計算有理數、[`float`](functions.xhtml#float "float") 或 [`complex`](functions.xhtml#complex "complex") 的哈希值:
```
import sys, math
def hash_fraction(m, n):
"""Compute the hash of a rational number m / n.
Assumes m and n are integers, with n positive.
Equivalent to hash(fractions.Fraction(m, n)).
"""
P = sys.hash_info.modulus
# Remove common factors of P. (Unnecessary if m and n already coprime.)
while m % P == n % P == 0:
m, n = m // P, n // P
if n % P == 0:
hash_value = sys.hash_info.inf
else:
# Fermat's Little Theorem: pow(n, P-1, P) is 1, so
# pow(n, P-2, P) gives the inverse of n modulo P.
hash_value = (abs(m) % P) * pow(n, P - 2, P) % P
if m < 0:
hash_value = -hash_value
if hash_value == -1:
hash_value = -2
return hash_value
def hash_float(x):
"""Compute the hash of a float x."""
if math.isnan(x):
return sys.hash_info.nan
elif math.isinf(x):
return sys.hash_info.inf if x > 0 else -sys.hash_info.inf
else:
return hash_fraction(*x.as_integer_ratio())
def hash_complex(z):
"""Compute the hash of a complex number z."""
hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)
# do a signed reduction modulo 2**sys.hash_info.width
M = 2**(sys.hash_info.width - 1)
hash_value = (hash_value & (M - 1)) - (hash_value & M)
if hash_value == -1:
hash_value = -2
return hash_value
```
## 迭代器類型
Python 支持在容器中進行迭代的概念。 這是通過使用兩個單獨方法來實現的;它們被用于允許用戶自定義類對迭代的支持。 將在下文中詳細描述的序列總是支持迭代方法。
容器對象要提供迭代支持,必須定義一個方法:
`container.``__iter__`()返回一個迭代器對象。 該對象需要支持下文所述的迭代器協議。 如果容器支持不同的迭代類型,則可以提供額外的方法來專門地請求不同迭代類型的迭代器。 (支持多種迭代形式的對象的例子有同時支持廣度優先和深度優先遍歷的樹結構。) 此方法對應于 Python/C API 中 Python 對象類型結構體的 [`tp_iter`](../c-api/typeobj.xhtml#c.PyTypeObject.tp_iter "PyTypeObject.tp_iter") 槽位。
迭代器對象自身需要支持以下兩個方法,它們共同組成了 *迭代器協議*:
`iterator.``__iter__`()返回迭代器對象本身。 這是同時允許容器和迭代器配合 [`for`](../reference/compound_stmts.xhtml#for) 和 [`in`](../reference/expressions.xhtml#in) 語句使用所必須的。 此方法對應于 Python/C API 中 Python 對象類型結構體的 [`tp_iter`](../c-api/typeobj.xhtml#c.PyTypeObject.tp_iter "PyTypeObject.tp_iter") 槽位。
`iterator.``__next__`()從容器中返回下一項。 如果已經沒有項可返回,則會引發 [`StopIteration`](exceptions.xhtml#StopIteration "StopIteration") 異常。 此方法對應于 Python/C API 中 Python 對象類型結構體的 [`tp_iternext`](../c-api/typeobj.xhtml#c.PyTypeObject.tp_iternext "PyTypeObject.tp_iternext") 槽位。
Python 定義了幾種迭代器對象以支持對一般和特定序列類型、字典和其他更特別的形式進行迭代。 除了迭代器協議的實現,特定類型的其他性質對迭代操作來說都不重要。
一旦迭代器的 [`__next__()`](#iterator.__next__ "iterator.__next__") 方法引發了 [`StopIteration`](exceptions.xhtml#StopIteration "StopIteration"),它必須一直對后續調用引發同樣的異常。 不遵循此行為特性的實現將無法正常使用。
### 生成器類型
Python 的 [generator](../glossary.xhtml#term-generator) 提供了一種實現迭代器協議的便捷方式。 如果容器對象 [`__iter__()`](../reference/datamodel.xhtml#object.__iter__ "object.__iter__") 方法被實現為一個生成器,它將自動返回一個迭代器對象(從技術上說是一個生成器對象),該對象提供 [`__iter__()`](../reference/datamodel.xhtml#object.__iter__ "object.__iter__") 和 [`__next__()`](../reference/expressions.xhtml#generator.__next__ "generator.__next__") 方法。 有關生成器的更多信息可以參閱 [yield 表達式的文檔](../reference/expressions.xhtml#yieldexpr)。
## 序列類型 --- [`list`](#list "list"), [`tuple`](#tuple "tuple"), [`range`](#range "range")
有三種基本序列類型:list, tuple 和 range 對象。 為處理 [二進制數據](#binaryseq) 和 [文本字符串](#textseq) 而特別定制的附加序列類型會在專門的小節中描述。
### 通用序列操作
大多數序列類型,包括可變類型和不可變類型都支持下表中的操作。 [`collections.abc.Sequence`](collections.abc.xhtml#collections.abc.Sequence "collections.abc.Sequence") ABC 被提供用來更容易地在自定義序列類型上正確地實現這些操作。
此表按優先級升序列出了序列操作。 在表格中,*s* 和 *t* 是具有相同類型的序列,*n*, *i*, *j* 和 *k* 是整數而 *x* 是任何滿足 *s* 所規定的類型和值限制的任意對象。
`in` 和 `not in` 操作具有與比較操作相同的優先級。 `+` (拼接) 和 `*` (重復) 操作具有與對應數值運算相同的優先級。 [3](#id14)
運算
結果
注釋
`x in s`
如果 *s* 中的某項等于 *x* 則結果為 `True`,否則為 `False`
(1)
`x not in s`
如果 *s* 中的某項等于 *x* 則結果為 `False`,否則為 `True`
(1)
`s + t`
*s* 與 *t* 相拼接
(6)(7)
`s * n` 或 `n * s`
相當于 *s* 與自身進行 *n* 次拼接
(2)(7)
`s[i]`
*s* 的第 *i* 項,起始為 0
(3)
`s[i:j]`
*s* 從 *i* 到 *j* 的切片
(3)(4)
`s[i:j:k]`
*s* 從 *i* 到 *j* 步長為 *k* 的切片
(3)(5)
`len(s)`
*s* 的長度
`min(s)`
*s* 的最小項
`max(s)`
*s* 的最大項
`s.index(x[, i[, j]])`
*x* 在 *s* 中首次出現項的索引號(索引號在 *i* 或其后且在 *j* 之前)
(8)
`s.count(x)`
*x* 在 *s* 中出現的總次數
相同類型的序列也支持比較。 特別地,tuple 和 list 的比較是通過比較對應元素的字典順序。 這意味著想要比較結果相等,則每個元素比較結果都必須相等,并且兩個序列長度必須相同。 (完整細節請參閱語言參考的 [比較運算](../reference/expressions.xhtml#comparisons) 部分。)
注釋:
1. 雖然 `in` 和 `not in` 操作在通常情況下僅被用于簡單的成員檢測,某些專門化序列 (例如 [`str`](#str "str"), [`bytes`](#bytes "bytes") 和 [`bytearray`](#bytearray "bytearray")) 也使用它們進行子序列檢測:
```
>>> "gg" in "eggs"
True
```
2. 小于 `0` 的 *n* 值會被當作 `0` 來處理 (生成一個與 *s* 同類型的空序列)。 請注意序列 *s* 中的項并不會被拷貝;它們會被多次引用。 這一點經常會令 Python 編程新手感到困擾;例如:
```
>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]
```
具體的原因在于 `[[]]` 是一個包含了一個空列表的單元素列表,所以 `[[]] * 3` 結果中的三個元素都是對這一個空列表的引用。 修改 `lists` 中的任何一個元素實際上都是對這一個空列表的修改。 你可以用以下方式創建以不同列表為元素的列表:
```
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]
```
進一步的解釋可以在 FAQ 條目 [如何創建多維列表?](../faq/programming.xhtml#faq-multidimensional-list) 中查看。
3. 如果 *i* 或 *j* 為負值,則索引順序是相對于序列 *s* 的末尾: 索引號會被替換為 `len(s) + i` 或 `len(s) + j`。 但要注意 `-0` 仍然為 `0`。
4. *s* 從 *i* 到 *j* 的切片被定義為所有滿足 `i <= k < j` 的索引號 *k* 的項組成的序列。 如果 *i* 或 *j* 大于 `len(s)`,則使用 `len(s)`。 如果 *i* 被省略或為 `None`,則使用 `0`。 如果 *j* 被省略或為 `None`,則使用 `len(s)`。 如果 *i* 大于等于 *j*,則切片為空。
5. *s* 從 *i* 到 *j* 步長為 *k* 的切片被定義為所有滿足 `0 <= n < (j-i)/k` 的索引號 `x = i + n*k` 的項組成的序列。 換句話說,索引號為 `i`, `i+k`, `i+2*k`, `i+3*k`,以此類推,當達到 *j* 時停止 (但一定不包括 *j*)。 當 *k* 為正值時,*i* 和 *j* 會被減至不大于 `len(s)`。 當 *k* 為負值時,*i* 和 *j* 會被減至不大于 `len(s) - 1`。 如果 *i* 或 *j* 被省略或為 `None`,它們會成為“終止”值 (是哪一端的終止值則取決于 *k* 的符號)。 請注意,*k* 不可為零。 如果 *k* 為 `None`,則當作 `1` 處理。
6. 拼接不可變序列總是會生成新的對象。 這意味著通過重復拼接來構建序列的運行時開銷將會基于序列總長度的乘方。 想要獲得線性的運行時開銷,你必須改用下列替代方案之一:
- 如果拼接 [`str`](#str "str") 對象,你可以構建一個列表并在最后使用 [`str.join()`](#str.join "str.join") 或是寫入一個 [`io.StringIO`](io.xhtml#io.StringIO "io.StringIO") 實例并在結束時獲取它的值
- 如果拼接 [`bytes`](#bytes "bytes") 對象,你可以類似地使用 [`bytes.join()`](#bytes.join "bytes.join") 或 [`io.BytesIO`](io.xhtml#io.BytesIO "io.BytesIO"),或者你也可以使用 [`bytearray`](#bytearray "bytearray") 對象進行原地拼接。 [`bytearray`](#bytearray "bytearray") 對象是可變的,并且具有高效的重分配機制
- 如果拼接 [`tuple`](#tuple "tuple") 對象,請改為擴展 [`list`](#list "list") 類
- 對于其它類型,請查看相應的文檔
7. 某些序列類型 (例如 [`range`](#range "range")) 僅支持遵循特定模式的項序列,因此并不支持序列拼接或重復。
8. 當 *x* 在 *s* 中找不到時 `index` 會引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError")。 不是所有實現都支持傳入額外參數 *i* 和 *j*。 這兩個參數允許高效地搜索序列的子序列。 傳入這兩個額外參數大致相當于使用 `s[i:j].index(x)`,但是不會復制任何數據,并且返回的索引是相對于序列的開頭而非切片的開頭。
### 不可變序列類型
不可變序列類型普遍實現而可變序列類型未實現的唯一操作就是對 [`hash()`](functions.xhtml#hash "hash") 內置函數的支持。
這種支持允許不可變類型,例如 [`tuple`](#tuple "tuple") 實例被用作 [`dict`](#dict "dict") 鍵,以及存儲在 [`set`](#set "set") 和 [`frozenset`](#frozenset "frozenset") 實例中。
嘗試對包含有不可哈希值的不可變序列進行哈希運算將會導致 [`TypeError`](exceptions.xhtml#TypeError "TypeError")。
### 可變序列類型
以下表格中的操作是在可變序列類型上定義的。 [`collections.abc.MutableSequence`](collections.abc.xhtml#collections.abc.MutableSequence "collections.abc.MutableSequence") ABC 被提供用來更容易地在自定義序列類型上正確實現這些操作。
表格中的 *s* 是可變序列類型的實例,*t* 是任意可迭代對象,而 *x* 是符合對 *s* 所規定類型與值限制的任何對象 (例如,[`bytearray`](#bytearray "bytearray") 僅接受滿足 `0 <= x <= 255` 值限制的整數)。
運算
結果
注釋
`s[i] = x`
將 *s* 的第 *i* 項替換為 *x*
`s[i:j] = t`
將 *s* 從 *i* 到 *j* 的切片替換為可迭代對象 *t* 的內容
`del s[i:j]`
等同于 `s[i:j] = []`
`s[i:j:k] = t`
將 `s[i:j:k]` 的元素替換為 *t* 的元素
(1)
`del s[i:j:k]`
從列表中移除 `s[i:j:k]` 的元素
`s.append(x)`
將 *x* 添加到序列的末尾 (等同于 `s[len(s):len(s)] = [x]`)
`s.clear()`
從 *s* 中移除所有項 (等同于 `del s[:]`)
(5)
`s.copy()`
創建 *s* 的淺拷貝 (等同于 `s[:]`)
(5)
`s.extend(t)` 或 `s += t`
用 *t* 的內容擴展 *s* (基本上等同于 `s[len(s):len(s)] = t`)
`s *= n`
使用 *s* 的內容重復 *n* 次來對其進行更新
(6)
`s.insert(i, x)`
在由 *i* 給出的索引位置將 *x* 插入 *s* (等同于 `s[i:i] = [x]`)
`s.pop([i])`
提取在 *i* 位置上的項,并將其從 *s* 中移除
(2)
`s.remove(x)`
刪除 *s* 中第一個 `s[i]` 等于 *x* 的項目。
(3)
`s.reverse()`
就地將列表中的元素逆序。
(4)
注釋:
1. *t* 必須與它所替換的切片具有相同的長度。
2. 可選參數 *i* 默認為 `-1`,因此在默認情況下會移除并返回最后一項。
3. 當在 *s* 中找不到 *x* 時 `remove` 操作會引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError")。
4. 當反轉大尺寸序列時 `reverse()` 方法會原地修改該序列以保證空間經濟性。 為提醒用戶此操作是通過間接影響進行的,它并不會返回反轉后的序列。
5. 包括 `clear()` 和 `copy()` 是為了與不支持切片操作的可變容器 (例如 [`dict`](#dict "dict") 和 [`set`](#set "set")) 的接口保持一致
3\.3 新版功能: `clear()` 和 `copy()` 方法。
6. *n* 值為一個整數,或是一個實現了 [`__index__()`](../reference/datamodel.xhtml#object.__index__ "object.__index__") 的對象。 *n* 值為零或負數將清空序列。 序列中的項不會被拷貝;它們會被多次引用,正如 [通用序列操作](#typesseq-common) 中有關 `s * n` 的說明。
### 列表
列表是可變序列,通常用于存放同類項目的集合(其中精確的相似程度將根據應用而變化)。
*class* `list`(\[*iterable*\])可以用多種方式構建列表:
- 使用一對方括號來表示空列表: `[]`
- 使用方括號,其中的項以逗號分隔: `[a]`, `[a, b, c]`
- 使用列表推導式: `[x for x in iterable]`
- 使用類型的構造器: `list()` 或 `list(iterable)`
構造器將構造一個列表,其中的項與 *iterable* 中的項具有相同的的值與順序。 *iterable* 可以是序列、支持迭代的容器或其它可迭代對象。 如果 *iterable* 已經是一個列表,將創建并返回其副本,類似于 `iterable[:]`。 例如,`list('abc')` 返回 `['a', 'b', 'c']` 而 `list( (1, 2, 3) )` 返回 `[1, 2, 3]`。 如果沒有給出參數,構造器將創建一個空列表 `[]`。
其它許多操作也會產生列表,包括 [`sorted()`](functions.xhtml#sorted "sorted") 內置函數。
列表實現了所有 [一般](#typesseq-common) 和 [可變](#typesseq-mutable) 序列的操作。 列表還額外提供了以下方法:
`sort`(*\**, *key=None*, *reverse=False*)此方法會對列表進行原地排序,只使用 `<` 來進行各項間比較。 異常不會被屏蔽 —— 如果有任何比較操作失敗,整個排序操作將失敗(而列表可能會處于被部分修改的狀態)。
[`sort()`](#list.sort "list.sort") 接受兩個僅限以關鍵字形式傳入的參數 ([僅限關鍵字參數](../glossary.xhtml#keyword-only-parameter)):
*key* 指定帶有一個參數的函數,用于從每個列表元素中提取比較鍵 (例如 `key=str.lower`)。 對應于列表中每一項的鍵會被計算一次,然后在整個排序過程中使用。 默認值 `None` 表示直接對列表項排序而不計算一個單獨的鍵值。
可以使用 [`functools.cmp_to_key()`](functools.xhtml#functools.cmp_to_key "functools.cmp_to_key") 將 2.x 風格的 *cmp* 函數轉換為 *key* 函數。
*reverse* 為一個布爾值。 如果設為 `True`,則每個列表元素將按反向順序比較進行排序。
當順序大尺寸序列時此方法會原地修改該序列以保證空間經濟性。 為提醒用戶此操作是通過間接影響進行的,它并不會返回排序后的序列(請使用 [`sorted()`](functions.xhtml#sorted "sorted") 顯示地請求一個新的已排序列表實例)。
[`sort()`](#list.sort "list.sort") 方法確保是穩定的。 如果一個排序確保不會改變比較結果相等的元素的相對順序就稱其為穩定的 --- 這有利于進行多重排序(例如先按部門、再接薪級排序)。
**CPython implementation detail:** 在一個列表被排序期間,嘗試改變甚至進行檢測也會造成未定義的影響。 Python 的 C 實現會在排序期間將列表顯示為空,如果發現列表在排序期間被改變將會引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError")。
### 元組
元組是不可變序列,通常用于儲存異構數據的多項集(例如由 [`enumerate()`](functions.xhtml#enumerate "enumerate") 內置函數所產生的二元組)。 元組也被用于需要同構數據的不可變序列的情況(例如允許存儲到 [`set`](#set "set") 或 [`dict`](#dict "dict") 的實例)。
*class* `tuple`(\[*iterable*\])可以用多種方式構建元組:
- 使用一對圓括號來表示空元組: `()`
- 使用一個后綴的逗號來表示單元組: `a,` 或 `(a,)`
- 使用以逗號分隔的多個項: `a, b, c` or `(a, b, c)`
- 使用內置的 [`tuple()`](#tuple "tuple"): `tuple()` 或 `tuple(iterable)`
構造器將構造一個元組,其中的項與 *iterable* 中的項具有相同的值與順序。 *iterable* 可以是序列、支持迭代的容器或其他可迭代對象。 如果 *iterable* 已經是一個元組,會不加改變地將其返回。 例如,`tuple('abc')` 返回 `('a', 'b', 'c')` 而 `tuple( [1, 2, 3] )` 返回 `(1, 2, 3)`。 如果沒有給出參數,構造器將創建一個空元組 `()`。
請注意決定生成元組的其實是逗號而不是圓括號。 圓括號只是可選的,生成空元組或需要避免語法歧義的情況除外。 例如,`f(a, b, c)` 是在調用函數時附帶三個參數,而 `f((a, b, c))` 則是在調用函數時附帶一個三元組。
元組實現了所有 [一般](#typesseq-common) 序列的操作。
對于通過名稱訪問相比通過索引訪問更清晰的異構數據多項集,[`collections.namedtuple()`](collections.xhtml#collections.namedtuple "collections.namedtuple") 可能是比簡單元組對象更為合適的選擇。
### range 對象
[`range`](#range "range") 類型表示不可變的數字序列,通常用于在 [`for`](../reference/compound_stmts.xhtml#for) 循環中循環指定的次數。
*class* `range`(*stop*)*class* `range`(*start*, *stop*\[, *step*\])range 構造器的參數必須為整數(可以是內置的 [`int`](functions.xhtml#int "int") 或任何實現了 `__index__` 特殊方法的對象)。 如果省略 *step* 參數,其默認值為 `1`。 如果省略 *start* 參數,其默認值為 `0`,如果 *step* 為零則會引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError")。
如果 *step* 為正值,確定 range `r` 內容的公式為 `r[i] = start + step*i` 其中 `i >= 0` 且 `r[i] < stop`。
如果 *step* 為負值,確定 range 內容的公式仍然為 `r[i] = start + step*i`,但限制條件改為 `i >= 0` 且 `r[i] > stop`.
如果 `r[0]` 不符合值的限制條件,則該 range 對象為空。 range 對象確實支持負索引,但是會將其解讀為從正索引所確定的序列的末尾開始索引。
元素絕對值大于 [`sys.maxsize`](sys.xhtml#sys.maxsize "sys.maxsize") 的 range 對象是被允許的,但某些特性 (例如 [`len()`](functions.xhtml#len "len")) 可能引發 [`OverflowError`](exceptions.xhtml#OverflowError "OverflowError")。
一些 range 對象的例子:
```
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0))
[]
>>> list(range(1, 0))
[]
```
range 對象實現了 [一般](#typesseq-common) 序列的所有操作,但拼接和重復除外(這是由于 range 對象只能表示符合嚴格模式的序列,而重復和拼接通常都會違反這樣的模式)。
`start`*start* 形參的值 (如果該形參未提供則為 `0`)
`stop`*stop* 形參的值
`step`*step* 形參的值 (如果該形參未提供則為 `1`)
[`range`](#range "range") 類型相比常規 [`list`](#list "list") 或 [`tuple`](#tuple "tuple") 的優勢在于一個 [`range`](#range "range") 對象總是占用固定數量的(較小)內存,不論其所表示的范圍有多大(因為它只保存了 `start`, `stop` 和 `step` 值,并會根據需要計算具體單項或子范圍的值)。
range 對象實現了 [`collections.abc.Sequence`](collections.abc.xhtml#collections.abc.Sequence "collections.abc.Sequence") ABC,提供如包含檢測、元素索引查找、切片等特性,并支持負索引 (參見 [序列類型 --- list, tuple, range](#typesseq)):
```
>>> r = range(0, 20, 2)
>>> r
range(0, 20, 2)
>>> 11 in r
False
>>> 10 in r
True
>>> r.index(10)
5
>>> r[5]
10
>>> r[:5]
range(0, 10, 2)
>>> r[-1]
18
```
使用 `==` 和 `!=` 檢測 range 對象是否相等是將其作為序列來比較。 也就是說,如果兩個 range 對象表示相同的值序列就認為它們是相等的。 (請注意比較結果相等的兩個 range 對象可能會具有不同的 [`start`](#range.start "range.start"), [`stop`](#range.stop "range.stop") 和 [`step`](#range.step "range.step") 屬性,例如 `range(0) == range(2, 1, 3)` 而 `range(0, 3, 2) == range(0, 4, 2)`。)
在 3.2 版更改: 實現 Sequence ABC。 支持切片和負數索引。 使用 [`int`](functions.xhtml#int "int") 對象在固定時間內進行成員檢測,而不是逐一迭代所有項。
在 3.3 版更改: 定義 '==' 和 '!=' 以根據 range 對象所定義的值序列來進行比較(而不是根據對象的標識)。
3\.3 新版功能: [`start`](#range.start "range.start"), [`stop`](#range.stop "range.stop") 和 [`step`](#range.step "range.step") 屬性。
參見
- [linspace recipe](http://code.activestate.com/recipes/579000/) \[http://code.activestate.com/recipes/579000/\] 演示了如何實現一個延遲求值版本的適合浮點數應用的 range 對象。
## 文本序列類型 --- [`str`](#str "str")
在 Python 中處理文本數據是使用 [`str`](#str "str") 對象,也稱為 *字符串*。 字符串是由 Unicode 碼位構成的不可變 [序列](#typesseq)。 字符串字面值有多種不同的寫法:
- 單引號: `'允許包含有 "雙" 引號'`
- 雙引號: `"允許包含有 '單' 引號"`。
- 三重引號: `'''三重單引號'''`, `"""三重雙引號"""`
使用三重引號的字符串可以跨越多行 —— 其中所有的空白字符都將包含在該字符串字面值中。
作為單一表達式組成部分,之間只由空格分隔的多個字符串字面值會被隱式地轉換為單個字符串字面值。 也就是說,`("spam " "eggs") == "spam eggs"`。
請參閱 [字符串和字節串字面值](../reference/lexical_analysis.xhtml#strings) 有解有關不同字符串字面值的更多信息,包括所支持的轉義序列,以及使用 `r` ("raw") 前綴來禁用大多數轉義序列的處理。
字符串也可以通過使用 [`str`](#str "str") 構造器從其他對象創建。
由于不存在單獨的“字符”類型,對字符串做索引操作將產生一個長度為 1 的字符串。 也就是說,對于一個非空字符串 *s*, `s[0] == s[0:1]`。
不存在可變的字符串類型,但是 [`str.join()`](#str.join "str.join") 或 [`io.StringIO`](io.xhtml#io.StringIO "io.StringIO") 可以被被用來根據多個片段高效率地構建字符串。
在 3.3 版更改: 為了與 Python 2 系列的向下兼容,再次允許字符串字面值使用 `u` 前綴。 它對字符串字面值的含義沒有影響,并且不能與 `r` 前綴同時出現。
*class* `str`(*object=''*)*class* `str`(*object=b''*, *encoding='utf-8'*, *errors='strict'*)返回 *object* 的 [字符串](#textseq) 版本。 如果未提供 *object* 則返回空字符串。 在其他情況下 `str()` 的行為取決于 *encoding* 或 *errors* 是否有給出,具體見下。
如果 *encoding* 或 *errors* 均未給出,`str(object)` 返回 [`object.__str__()`](../reference/datamodel.xhtml#object.__str__ "object.__str__"),這是 *object* 的“非正式”或格式良好的字符串表示。 對于字符串對象,這是該字符串本身。 如果 *object* 沒有 [`__str__()`](../reference/datamodel.xhtml#object.__str__ "object.__str__") 方法,則 [`str()`](#str "str") 將回退為返回 [`repr(object)`](functions.xhtml#repr "repr")。
如果 *encoding* 或 *errors* 至少給出其中之一,則 *object* 應該是一個 [bytes-like object](../glossary.xhtml#term-bytes-like-object) (例如 [`bytes`](#bytes "bytes") 或 [`bytearray`](#bytearray "bytearray"))。 在此情況下,如果 *object* 是一個 [`bytes`](#bytes "bytes") (或 [`bytearray`](#bytearray "bytearray")) 對象,則 `str(bytes, encoding, errors)` 等價于 [`bytes.decode(encoding, errors)`](#bytes.decode "bytes.decode")。 否則的話,會在調用 [`bytes.decode()`](#bytes.decode "bytes.decode") 之前獲取緩沖區對象下層的 bytes 對象。 請參閱 [二進制序列類型 --- bytes, bytearray, memoryview](#binaryseq) 與 [緩沖協議](../c-api/buffer.xhtml#bufferobjects) 了解有關緩沖區對象的信息。
將一個 [`bytes`](#bytes "bytes") 對象傳入 [`str()`](#str "str") 而不給出 *encoding* 或 *errors* 參數的操作屬于第一種情況, 將返回非正式的字符串表示(另請參閱 Python 的 [`-b`](../using/cmdline.xhtml#cmdoption-b) 命令行選項)。 例如:
```
>>> str(b'Zoot!')
"b'Zoot!'"
```
有關 `str` 類及其方法的更多信息,請參閱下面的 [文本序列類型 --- str](#textseq) 和 [字符串的方法](#string-methods) 小節。 要輸出格式化字符串,請參閱 [格式化字符串字面值](../reference/lexical_analysis.xhtml#f-strings) 和 [格式字符串語法](string.xhtml#formatstrings) 小節。 此外還可以參閱 [文本處理服務](text.xhtml#stringservices) 小節。
### 字符串的方法
字符串實現了所有 [一般](#typesseq-common) 序列的操作,還額外提供了以下列出的一些附加方法。
字符串還支持兩種字符串格式化樣式,一種提供了很大程度的靈活性和可定制性 (參閱 [`str.format()`](#str.format "str.format"), [格式字符串語法](string.xhtml#formatstrings) 和 [自定義字符串格式](string.xhtml#string-formatting)) 而另一種是基于 C `printf` 樣式的格式化,它可處理的類型范圍較窄,并且更難以正確使用,但對于它可處理的情況往往會更為快速 ([printf 風格的字符串格式化](#old-string-formatting))。
標準庫的 [文本處理服務](text.xhtml#textservices) 部分涵蓋了許多其他模塊,提供各種文本相關工具(例如包含于 [`re`](re.xhtml#module-re "re: Regular expression operations.") 模塊中的正則表達式支持)。
`str.``capitalize`()返回原字符串的副本,其首個字符大寫,其余為小寫。
`str.``casefold`()返回原字符串消除大小寫的副本。 消除大小寫的字符串可用于忽略大小寫的匹配。
消除大小寫類似于轉為小寫,但是更加徹底一些,因為它會移除字符串中的所有大小寫變化形式。 例如,德語小寫字母 `'?'` 相當于 `"ss"`。 由于它已經是小寫了,[`lower()`](#str.lower "str.lower") 不會對 `'?'` 做任何改變;而 [`casefold()`](#str.casefold "str.casefold") 則會將其轉換為 `"ss"`。
消除大小寫算法的描述請參見 Unicode 標準的 3.13 節。
3\.3 新版功能.
`str.``center`(*width*\[, *fillchar*\])返回長度為 *width* 的字符串,原字符串在其正中。 使用指定的 *fillchar* 填充兩邊的空位(默認使用 ASCII 空格符)。 如果 *width* 小于等于 `len(s)` 則返回原字符串的副本。
`str.``count`(*sub*\[, *start*\[, *end*\]\])反回子字符串 *sub* 在 \[*start*, *end*\] 范圍內非重疊出現的次數。 可選參數 *start* 與 *end* 會被解讀為切片表示法。
`str.``encode`(*encoding="utf-8"*, *errors="strict"*)返回原字符串編碼為字節串對象的版本。 默認編碼為 `'utf-8'`。 可以給出 *errors* 來設置不同的錯誤處理方案。 *errors* 的默認值為 `'strict'`,表示編碼錯誤會引發 [`UnicodeError`](exceptions.xhtml#UnicodeError "UnicodeError")。 其他可用的值為 `'ignore'`, `'replace'`, `'xmlcharrefreplace'`, `'backslashreplace'` 以及任何其他通過 [`codecs.register_error()`](codecs.xhtml#codecs.register_error "codecs.register_error") 注冊的值,請參閱 [Error Handlers](codecs.xhtml#error-handlers) 小節。 要查看可用的編碼列表,請參閱 [標準編碼](codecs.xhtml#standard-encodings) 小節。
在 3.1 版更改: 加入了對關鍵字參數的支持。
`str.``endswith`(*suffix*\[, *start*\[, *end*\]\])如果字符串以指定的 *suffix* 結束返回 `True`,否則返回 `False`。 *suffix* 也可以為由多個供查找的后綴構成的元組。 如果有可選項 *start*,將從所指定位置開始檢查。 如果有可選項 *end*,將在所指定位置停止比較。
`str.``expandtabs`(*tabsize=8*)返回字符串的副本,其中所有的制表符會由一個或多個空格替換,具體取決于當前列位置和給定的制表符寬度。 每 *tabsize* 個字符設為一個制表位(默認值 8 時設定的制表位在列 0, 8, 16 依次類推)。 要展開字符串,當前列將被設為零并逐一檢查字符串中的每個字符。 如果字符為制表符 (`\t`),則會在結果中插入一個或多個空格符,直到當前列等于下一個制表位。 (制表符本身不會被復制。) 如果字符為換行符 (`\n`) 或回車符 (`\r`),它會被復制并將當前列重設為零。 任何其他字符會被不加修改地復制并將當前列加一,不論該字符在被打印時會如何顯示。
```
>>> '01\t012\t0123\t01234'.expandtabs()
'01 012 0123 01234'
>>> '01\t012\t0123\t01234'.expandtabs(4)
'01 012 0123 01234'
```
`str.``find`(*sub*\[, *start*\[, *end*\]\])返回子字符串 *sub* 在 `s[start:end]` 切片內被找到的最小索引。 可選參數 *start* 與 *end* 會被解讀為切片表示法。 如果 *sub* 未被找到則返回 `-1`。
注解
[`find()`](#str.find "str.find") 方法應該只在你需要知道 *sub* 所在位置時使用。 要檢查 *sub* 是否為子字符串,請使用 [`in`](../reference/expressions.xhtml#in) 操作符:
```
>>> 'Py' in 'Python'
True
```
`str.``format`(*\*args*, *\*\*kwargs*)執行字符串格式化操作。 調用此方法的字符串可以包含字符串字面值或者以花括號 `{}` 括起來的替換域。 每個替換域可以包含一個位置參數的數字索引,或者一個關鍵字參數的名稱。 返回的字符串副本中每個替換域都會被替換為對應參數的字符串值。
```
>>> "The sum of 1 + 2 is {0}".format(1+2)
'The sum of 1 + 2 is 3'
```
請參閱 [格式字符串語法](string.xhtml#formatstrings) 了解有關可以在格式字符串中指定的各種格式選項的說明。
注解
當使用 `n` 類型 (例如: `'{:n}'.format(1234)`) 來格式化數字 ([`int`](functions.xhtml#int "int"), [`float`](functions.xhtml#float "float"), [`complex`](functions.xhtml#complex "complex"), [`decimal.Decimal`](decimal.xhtml#decimal.Decimal "decimal.Decimal") 及其子類) 的時候,該函數會臨時性地將 `LC_CTYPE` 區域設置為 `LC_NUMERIC` 區域以解碼 `localeconv()` 的 `decimal_point` 和 `thousands_sep` 字段,如果它們是非 ASCII 字符或長度超過 1 字節的話,并且 `LC_NUMERIC` 區域會與 `LC_CTYPE` 區域不一致。 這個臨時更改會影響其他線程。
在 3.7 版更改: 當使用 `n` 類型格式化數字時,該函數在某些情況下會臨時性地將 `LC_CTYPE` 區域設置為 `LC_NUMERIC` 區域。
`str.``format_map`(*mapping*)類似于 `str.format(**mapping)`,不同之處在于 `mapping` 會被直接使用而不是復制到一個 [`dict`](#dict "dict")。 適宜使用此方法的一個例子是當 `mapping` 為 dict 的子類的情況:
```
>>> class Default(dict):
... def __missing__(self, key):
... return key
...
>>> '{name} was born in {country}'.format_map(Default(name='Guido'))
'Guido was born in country'
```
3\.2 新版功能.
`str.``index`(*sub*\[, *start*\[, *end*\]\])類似于 [`find()`](#str.find "str.find"),但在找不到子類時會引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError")。
`str.``isalnum`()如果字符串中至少有一個字符且所有字符均為字母或數字則返回真值,否則返回假值。 如果以下方法中的一個返回 `True` 則字符 `c` 為字母或數字: `c.isalpha()`, `c.isdecimal()`, `c.isdigit()`, or `c.isnumeric()`。
`str.``isalpha`()如果字符串中至少有一個字符且所有字符均為字母則返回真值,否則返回假值。 字母類字符是在 Unicode 字符數據庫中被定義為 "Letter" 的字符,即一般分類特征屬性為 "Lm", "Lt", "Lu", "Ll" 或 "Lo" 其中之一。 請注意這不同于 Unicode 標準所定義的 "Alphabetic" 特征屬性。
`str.``isascii`()如果字符串為空或所有字符均為 ASCII 字符則返回真值,否則返回假值。 ASCII 字符的碼位范圍為 U+0000-U+007F。
3\.7 新版功能.
`str.``isdecimal`()如果字符串中至少有一個字符且所有字符均為十進制數字符則返回真值,否則返回假值。 十進制數字符是以 10 為基數的計數制會用來組成數值的字符,例如 U+0660, ARABIC-INDIC DIGIT ZERO。 正式的定義為:十進制數字符就是 Unicode 一般分類 "Nd" 中的字符。
`str.``isdigit`()如果字符串中至少有一個字符且所有字符均為數字字符則返回真值,否則返回假值。 數字字符包括十進制數字符和需要特別處理的數字,例如兼容性上標數字。 這也涵蓋了不能被用來組成以 10 為基數的數值的數字,例如 Kharosthi 數字。 正式的定義為:數字字符就是特征屬性值 Numeric\_Type=Digit 或 Numeric\_Type=Decimal 的字符。
`str.``isidentifier`()如果字符串根據語言定義屬于有效的標識符則返回真值,參見 [標識符和關鍵字](../reference/lexical_analysis.xhtml#identifiers)。
請使用 [`keyword.iskeyword()`](keyword.xhtml#keyword.iskeyword "keyword.iskeyword") 來檢測保留標識符,例如 [`def`](../reference/compound_stmts.xhtml#def) 和 [`class`](../reference/compound_stmts.xhtml#class)。
`str.``islower`()如果字符串中至少有一個區分大小寫的字符 [4](#id15) 且此類字符均為小寫則返回真值,否則返回假值。
`str.``isnumeric`()如果字符串中至少有一個字符且所有字符均為數值字符則返回真值,否則返回假值。 數值字符包括數字字符,以及所有在 Unicode 中設置了數值特性屬性的字符,例如 U+2155, VULGAR FRACTION ONE FIFTH。 正式的定義為:數值字符就是具有特征屬性值 Numeric\_Type=Digit, Numeric\_Type=Decimal 或 Numeric\_Type=Numeric 的字符。
`str.``isprintable`()如果字符串中所有字符均為可打印字符或字符串為空則返回真值,否則返回假值。 不可打印字符是在 Unicode 字符數據庫中被定義為 "Other" 或 "Separator" 的字符,例外情況是 ASCII 空格字符 (0x20) 被視作可打印字符。 (請注意在此語境下可打印字符是指當對一個字符串發起調用 [`repr()`](functions.xhtml#repr "repr") 時不必被轉義的字符。 它們與字符串寫入 [`sys.stdout`](sys.xhtml#sys.stdout "sys.stdout") 或 [`sys.stderr`](sys.xhtml#sys.stderr "sys.stderr") 時所需的處理無關。)
`str.``isspace`()如果字符串中至少有一個字符且所有字符均為空白字符則返回真值,否則返回假值。 空白字符是在 Unicode 字符數據庫中被定義為 "Other" 或 "Separator" 并且其雙向特征屬性為 "WS", "B" 或 "S" 之一的字符。
`str.``istitle`()如果字符串中至少有一個字符且為標題字符串則返回真值,例如大寫字符之后只能帶非大寫字符而小寫字符必須有大寫字符打頭。 否則返回假值。
`str.``isupper`()如果字符串中至少有一個區分大小寫的字符 [4](#id15) 具此類字符均為大寫則返回真值,否則返回假值。
`str.``join`(*iterable*)返回一個由 *iterable* 中的字符串拼接而成的字符串。 如果 *iterable* 中存在任何非字符串值包括 [`bytes`](#bytes "bytes") 對象則會引發 [`TypeError`](exceptions.xhtml#TypeError "TypeError")。 調用該方法的字符串將作為元素之間的分隔。
`str.``ljust`(*width*\[, *fillchar*\])返回長度為 *width* 的字符串,原字符串在其中靠左對齊。 使用指定的 *fillchar* 填充空位 (默認使用 ASCII 空格符)。 如果 *width* 小于等于 `len(s)` 則返回原字符串的副本。
`str.``lower`()返回原字符串的副本,其所有區分大小寫的字符 [4](#id15) 均轉換為小寫。
所用轉換小寫算法的描述請參見 Unicode 標準的 3.13 節。
`str.``lstrip`(\[*chars*\])返回原字符串的副本,移除其中的前導字符。 *chars* 參數為指定要移除字符的字符串。 如果省略或為 `None`,則 *chars* 參數默認移除空格符。 實際上 *chars* 參數并非指定單個前綴;而是會移除參數值的所有組合:
```
>>> ' spacious '.lstrip()
'spacious '
>>> 'www.example.com'.lstrip('cmowz.')
'example.com'
```
*static* `str.``maketrans`(*x*\[, *y*\[, *z*\]\])此靜態方法返回一個可供 [`str.translate()`](#str.translate "str.translate") 使用的轉換對照表。
如果只有一個參數,則它必須是一個將 Unicode 碼位序號(整數)或字符(長度為 1 的字符串)映射到 Unicode 碼位序號、(任意長度的)字符串或 `None` 的字典。 字符鍵將會被轉換為碼位序號。
如果有兩個參數,則它們必須是兩個長度相等的字符串,并且在結果字典中,x 中每個字符將被映射到 y 中相同位置的字符。 如果有第三個參數,它必須是一個字符串,其中的字符將在結果中被映射到 `None`。
`str.``partition`(*sep*)在 *sep* 首次出現的位置拆分字符串,返回一個 3 元組,其中包含分隔符之前的部分、分隔符本身,以及分隔符之后的部分。 如果分隔符未找到,則返回的 3 元組中包含字符本身以及兩個空字符串。
`str.``replace`(*old*, *new*\[, *count*\])返回字符串的副本,其中出現的所有子字符串 *old* 都將被替換為 *new*。 如果給出了可選參數 *count*,則只替換前 *count* 次出現。
`str.``rfind`(*sub*\[, *start*\[, *end*\]\])返回子字符串 *sub* 在字符串內被找到的最大(最右)索引,這樣 *sub* 將包含在 `s[start:end]` 當中。 可選參數 *start* 與 *end* 會被解讀為切片表示法。 如果未找到則返回 `-1`。
`str.``rindex`(*sub*\[, *start*\[, *end*\]\])類似于 [`rfind()`](#str.rfind "str.rfind"),但在子字符串 *sub* 未找到時會引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError")。
`str.``rjust`(*width*\[, *fillchar*\])返回長度為 *width* 的字符串,原字符串在其中靠右對齊。 使用指定的 *fillchar* 填充空位 (默認使用 ASCII 空格符)。 如果 *width* 小于等于 `len(s)` 則返回原字符串的副本。
`str.``rpartition`(*sep*)在 *sep* 最后一次出現的位置拆分字符串,返回一個 3 元組,其中包含分隔符之前的部分、分隔符本身,以及分隔符之后的部分。 如果分隔符未找到,則返回的 3 元組中包含兩個空字符串以及字符串本身。
`str.``rsplit`(*sep=None*, *maxsplit=-1*)返回一個由字符串內單詞組成的列表,使用 *sep* 作為分隔字符串。 如果給出了 *maxsplit*,則最多進行 *maxsplit* 次拆分,從 *最右邊* 開始。 如果 *sep* 未指定或為 `None`,任何空白字符串都會被作為分隔符。 除了從右邊開始拆分,[`rsplit()`](#str.rsplit "str.rsplit") 的其他行為都類似于下文所述的 [`split()`](#str.split "str.split")。
`str.``rstrip`(\[*chars*\])返回原字符串的副本,移除其中的末尾字符。 *chars* 參數為指定要移除字符的字符串。 如果省略或為 `None`,則 *chars* 參數默認移除空格符。 實際上 *chars* 參數并非指定單個后綴;而是會移除參數值的所有組合:
```
>>> ' spacious '.rstrip()
' spacious'
>>> 'mississippi'.rstrip('ipz')
'mississ'
```
`str.``split`(*sep=None*, *maxsplit=-1*)返回一個由字符串內單詞組成的列表,使用 *sep* 作為分隔字符串。 如果給出了 *maxsplit*,則最多進行 *maxsplit* 次拆分(因此,列表最多會有 `maxsplit+1` 個元素)。 如果 *maxsplit* 未指定或為 `-1`,則不限制拆分次數(進行所有可能的拆分)。
如果給出了 *sep*,則連續的分隔符不會被組合在一起而是被視為分隔空字符串 (例如 `'1,,2'.split(',')` 將返回 `['1', '', '2']`)。 *sep* 參數可能由多個字符組成 (例如 `'1<>2<>3'.split('<>')` 將返回 `['1', '2', '3']`)。 使用指定的分隔符拆分空字符串將返回 `['']`。
例如:
```
>>> '1,2,3'.split(',')
['1', '2', '3']
>>> '1,2,3'.split(',', maxsplit=1)
['1', '2,3']
>>> '1,2,,3,'.split(',')
['1', '2', '', '3', '']
```
如果 *sep* 未指定或為 `None`,則會應用另一種拆分算法:連續的空格會被視為單個分隔符,其結果將不包含開頭或末尾的空字符串,如果字符串包含前綴或后綴空格的話。 因此,使用 `None` 拆分空字符串或僅包含空格的字符串將返回 `[]`。
例如:
```
>>> '1 2 3'.split()
['1', '2', '3']
>>> '1 2 3'.split(maxsplit=1)
['1', '2 3']
>>> ' 1 2 3 '.split()
['1', '2', '3']
```
`str.``splitlines`(\[*keepends*\])返回由原字符串中各行組成的列表,在行邊界的位置拆分。 結果列表中不包含行邊界,除非給出了 *keepends* 且為真值。
此方法會以下列行邊界進行拆分。 特別地,行邊界是 [universal newlines](../glossary.xhtml#term-universal-newlines) 的一個超集。
表示符
描述
`\n`
換行
`\r`
回車
`\r\n`
回車 + 換行
`\v` 或 `\x0b`
行制表符
`\f` 或 `\x0c`
換表單
`\x1c`
文件分隔符
`\x1d`
組分隔符
`\x1e`
記錄分隔符
`\x85`
下一行 (C1 控制碼)
`\u2028`
行分隔符
`\u2029`
段分隔符
在 3.2 版更改: `\v` 和 `\f` 被添加到行邊界列表
例如:
```
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines()
['ab c', '', 'de fg', 'kl']
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
['ab c\n', '\n', 'de fg\r', 'kl\r\n']
```
不同于 [`split()`](#str.split "str.split"),當給出了分隔字符串 *sep* 時,對于空字符串此方法將返回一個空列表,而末尾的換行不會令結果中增加額外的行:
```
>>> "".splitlines()
[]
>>> "One line\n".splitlines()
['One line']
```
作為比較,`split('\n')` 的結果為:
```
>>> ''.split('\n')
['']
>>> 'Two lines\n'.split('\n')
['Two lines', '']
```
`str.``startswith`(*prefix*\[, *start*\[, *end*\]\])如果字符串以指定的 *prefix* 開始則返回 `True`,否則返回 `False`。 *prefix* 也可以為由多個供查找的前綴構成的元組。 如果有可選項 *start*,將從所指定位置開始檢查。 如果有可選項 *end*,將在所指定位置停止比較。
`str.``strip`(\[*chars*\])返回原字符串的副本,移除其中的前導和末尾字符。 *chars* 參數為指定要移除字符的字符串。 如果省略或為 `None`,則 *chars* 參數默認移除空格符。 實際上 *chars* 參數并非指定單個前綴或后綴;而是會移除參數值的所有組合:
```
>>> ' spacious '.strip()
'spacious'
>>> 'www.example.com'.strip('cmowz.')
'example'
```
最外側的前導和末尾 *chars* 參數值將從字符串中移除。 開頭端的字符的移除將在遇到一個未包含于 *chars* 所指定字符集的字符時停止。 類似的操作也將在結尾端發生。 例如:
```
>>> comment_string = '#....... Section 3.2.1 Issue #32 .......'
>>> comment_string.strip('.#! ')
'Section 3.2.1 Issue #32'
```
`str.``swapcase`()返回原字符串的副本,其中大寫字符轉換為小寫,反之亦然。 請注意 `s.swapcase().swapcase() == s` 并不一定為真值。
`str.``title`()返回原字符串的標題版本,其中每個單詞第一個字母為大寫,其余字母為小寫。
例如:
```
>>> 'Hello world'.title()
'Hello World'
```
該算法使用一種簡單的與語言無關的定義,將連續的字母組合視為單詞。 該定義在多數情況下都很有效,但它也意味著代表縮寫形式與所有格的撇號也會成為單詞邊界,這可能導致不希望的結果:
```
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
```
可以使用正則表達式來構建針對撇號的特別處理:
```
>>> import re
>>> def titlecase(s):
... return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
... lambda mo: mo.group(0)[0].upper() +
... mo.group(0)[1:].lower(),
... s)
...
>>> titlecase("they're bill's friends.")
"They're Bill's Friends."
```
`str.``translate`(*table*)返回原字符串的副本,其中每個字符按給定的轉換表進行映射。 轉換表必須是一個使用 [`__getitem__()`](../reference/datamodel.xhtml#object.__getitem__ "object.__getitem__") 來實現索引操作的對象,通常為 [mapping](../glossary.xhtml#term-mapping) 或 [sequence](../glossary.xhtml#term-sequence)。 當以 Unicode 碼位序號(整數)為索引時,轉換表對象可以做以下任何一種操作:返回 Unicode 序號或字符串,將字符映射為一個或多個字符;返回 `None`,將字符從結果字符串中刪除;或引發 [`LookupError`](exceptions.xhtml#LookupError "LookupError") 異常,將字符映射為其自身。
你可以使用 [`str.maketrans()`](#str.maketrans "str.maketrans") 基于不同格式的字符到字符映射來創建一個轉換映射表。
另請參閱 [`codecs`](codecs.xhtml#module-codecs "codecs: Encode and decode data and streams.") 模塊以了解定制字符映射的更靈活方式。
`str.``upper`()返回原字符串的副本,其中所有區分大小寫的字符 [4](#id15) 均轉換為大寫。 請注意如果 `s` 包含不區分大小寫的字符或者如果結果字符的 Unicode 類別不是 "Lu" (Letter, uppercase) 而是 "Lt" (Letter, titlecase) 則 `s.upper().isupper()` 有可能為 `False`。
所用轉換大寫算法的描述請參見 Unicode 標準的 3.13 節。
`str.``zfill`(*width*)返回原字符串的副本,在左邊填充 ASCII `'0'` 數碼使其長度變為 *width*。 正負值前綴 (`'+'`/`'-'`) 的處理方式是在正負符號 *之后* 填充而非在之前。 如果 *width* 小于等于 `len(s)` 則返回原字符串的副本。
例如:
```
>>> "42".zfill(5)
'00042'
>>> "-42".zfill(5)
'-0042'
```
### `printf` 風格的字符串格式化
注解
此處介紹的格式化操作具有多種怪異特性,可能導致許多常見錯誤(例如無法正確顯示元組和字典)。 使用較新的 [格式化字符串字面值](../reference/lexical_analysis.xhtml#f-strings),[`str.format()`](#str.format "str.format") 接口或 [模板字符串](string.xhtml#template-strings) 有助于避免這樣的錯誤。 這些替代方案中的每一種都更好地權衡并提供了簡單、靈活以及可擴展性優勢。
字符串具有一種特殊的內置操作:使用 `%` (取模) 運算符。 這也被稱為字符串的 *格式化* 或 *插值* 運算符。 對于 `format % values` (其中 *format* 為一個字符串),在 *format* 中的 `%` 轉換標記符將被替換為零個或多個 *values* 條目。 其效果類似于在 C 語言中使用 `sprintf()`。
如果 *format* 要求一個單獨參數,則 *values* 可以為一個非元組對象。 [5](#id16) 否則的話,*values* 必須或者是一個包含項數與格式字符串中指定的轉換符項數相同的元組,或者是一個單獨映射對象(例如字典)。
轉換標記符包含兩個或更多字符并具有以下組成,且必須遵循此處規定的順序:
1. `'%'` 字符,用于標記轉換符的起始。
2. 映射鍵(可選),由加圓括號的字符序列組成 (例如 `(somename)`)。
3. 轉換旗標(可選),用于影響某些轉換類型的結果。
4. 最小字段寬度(可選)。 如果指定為 `'*'` (星號),則實際寬度會從 *values* 元組的下一元素中讀取,要轉換的對象則為最小字段寬度和可選的精度之后的元素。
5. 精度(可選),以在 `'.'` (點號) 之后加精度值的形式給出。 如果指定為 `'*'` (星號),則實際精度會從 *values* 元組的下一元素中讀取,要轉換的對象則為精度之后的元素。
6. 長度修飾符(可選)。
7. 轉換類型。
當右邊的參數為一個字典(或其他映射類型)時,字符串中的格式 *必須* 包含加圓括號的映射鍵,對應 `'%'` 字符之后字典中的每一項。 映射鍵將從映射中選取要格式化的值。 例如:
```
>>> print('%(language)s has %(number)03d quote types.' %
... {'language': "Python", "number": 2})
Python has 002 quote types.
```
在此情況下格式中不能出現 `*` 標記符(因其需要一個序列類的參數列表)。
轉換旗標為:
標志
含義
`'#'`
值的轉換將使用“替代形式”(具體定義見下文)。
`'0'`
轉換將為數字值填充零字符。
`'-'`
轉換值將靠左對齊(如果同時給出 `'0'` 轉換,則會覆蓋后者)。
`' '`
(空格) 符號位轉換產生的正數(或空字符串)前將留出一個空格。
`'+'`
符號字符 (`'+'` 或 `'-'`) 將顯示于轉換結果的開頭(會覆蓋 "空格" 旗標)。
可以給出長度修飾符 (`h`, `l` 或 `L`),但會被忽略,因為對 Python 來說沒有必要 -- 所以 `%ld` 等價于 `%d`。
轉換類型為:
轉換符
含義
注釋
`'d'`
有符號十進制整數。
`'i'`
有符號十進制整數。
`'o'`
有符號八進制數。
(1)
`'u'`
過時類型 -- 等價于 `'d'`。
(6)
`'x'`
有符號十六進制數(小寫)。
(2)
`'X'`
有符號十六進制數(大寫)。
(2)
`'e'`
浮點指數格式(小寫)。
(3)
`'E'`
浮點指數格式(大寫)。
(3)
`'f'`
浮點十進制格式。
(3)
`'F'`
浮點十進制格式。
(3)
`'g'`
浮點格式。 如果指數小于 -4 或不小于精度則使用小寫指數格式,否則使用十進制格式。
(4)
`'G'`
浮點格式。 如果指數小于 -4 或不小于精度則使用大寫指數格式,否則使用十進制格式。
(4)
`'c'`
單個字符(接受整數或單個字符的字符串)。
`'r'`
字符串(使用 [`repr()`](functions.xhtml#repr "repr") 轉換任何 Python 對象)。
(5)
`'s'`
字符串(使用 [`str()`](#str "str") 轉換任何 Python 對象)。
(5)
`'a'`
字符串(使用 [`ascii()`](functions.xhtml#ascii "ascii") 轉換任何 Python 對象)。
(5)
`'%'`
不轉換參數,在結果中輸出一個 `'%'` 字符。
注釋:
1. 此替代形式會在第一個數碼之前插入標示八進制數的前綴 (`'0o'`)。
2. 此替代形式會在第一個數碼之前插入 `'0x'` 或 `'0X'` 前綴(取決于是使用 `'x'` 還是 `'X'` 格式)。
3. 此替代形式總是會在結果中包含一個小數點,即使其后并沒有數碼。
小數點后的數碼位數由精度決定,默認為 6。
4. 此替代形式總是會在結果中包含一個小數點,末尾各位的零不會如其他情況下那樣被移除。
小數點前后的有效數碼位數由精度決定,默認為 6。
5. 如果精度為 `N`,輸出將截短為 `N` 個字符。
6. 參見 [**PEP 237**](https://www.python.org/dev/peps/pep-0237) \[https://www.python.org/dev/peps/pep-0237\]。
由于 Python 字符串顯式指明長度,`%s` 轉換不會將 `'\0'` 視為字符串的結束。
在 3.1 版更改: 絕對值超過 1e50 的 `%f` 轉換不會再被替換為 `%g` 轉換。
## 二進制序列類型 --- [`bytes`](#bytes "bytes"), [`bytearray`](#bytearray "bytearray"), [`memoryview`](#memoryview "memoryview")
操作二進制數據的核心內置類型是 [`bytes`](#bytes "bytes") 和 [`bytearray`](#bytearray "bytearray")。 它們由 [`memoryview`](#memoryview "memoryview") 提供支持,該對象使用 [緩沖區協議](../c-api/buffer.xhtml#bufferobjects) 來訪問其他二進制對象所在內存,不需要創建對象的副本。
[`array`](array.xhtml#module-array "array: Space efficient arrays of uniformly typed numeric values.") 模塊支持高效地存儲基本數據類型,例如 32 位整數和 IEEE754 雙精度浮點值。
### bytes 對象
bytes 對象是由單個字節構成的不可變序列。 由于許多主要二進制協議都基于 ASCII 文本編碼,因此 bytes 對象提供了一些僅在處理 ASCII 兼容數據時可用,并且在許多特性上與字符串對象緊密相關的方法。
*class* `bytes`(\[*source*\[, *encoding*\[, *errors*\]\]\])首先,表示 bytes 字面值的語法與字符串字面值的大致相同,只是添加了一個 `b` 前綴:
- 單引號: `b'同樣允許嵌入 "雙" 引號'`。
- 雙引號: `b"同樣允許嵌入 '單' 引號"`。
- 三重引號: `b'''三重單引號'''`, `b"""三重雙引號"""`
bytes 字面值中只允許 ASCII 字符(無論源代碼聲明的編碼為何)。 任何超出 127 的二進制值必須使用相應的轉義序列形式加入 bytes 字面值。
像字符串字面值一樣,bytes 字面值也可以使用 `r` 前綴來禁用轉義序列處理。 請參閱 [字符串和字節串字面值](../reference/lexical_analysis.xhtml#strings) 了解有關各種 bytes 字面值形式的詳情,包括所支持的轉義序列。
雖然 bytes 字面值和表示法是基于 ASCII 文本的,但 bytes 對象的行為實際上更像是不可變的整數序列,序列中的每個值的大小被限制為 `0 <= x < 256` (如果違反此限制將引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError"))。 這種限制是有意設計用以強調以下事實,雖然許多二進制格式都包含基于 ASCII 的元素,可以通過某些面向文本的算法進行有用的操作,但情況對于任意二進制數據來說通常卻并非如此(盲目地將文本處理算法應用于不兼容 ASCII 的二進制數據格式往往將導致數據損壞)。
除了字面值形式,bytes 對象還可以通過其他幾種方式來創建:
- 指定長度的以零值填充的 bytes 對象: `bytes(10)`
- 通過由整數組成的可迭代對象: `bytes(range(20))`
- 通過緩沖區協議復制現有的二進制數據: `bytes(obj)`
另請參閱 [bytes](functions.xhtml#func-bytes) 內置類型。
由于兩個十六進制數碼精確對應一個字節,因此十六進制數是描述二進制數據的常用格式。 相應地,bytes 類型具有從此種格式讀取數據的附加類方法:
*classmethod* `fromhex`(*string*)此 [`bytes`](#bytes "bytes") 類方法返回一個解碼給定字符串的 bytes 對象。 字符串必須由表示每個字節的兩個十六進制數碼構成,其中的 ASCII 空白符會被忽略。
```
>>> bytes.fromhex('2Ef0 F1f2 ')
b'.\xf0\xf1\xf2'
```
在 3.7 版更改: [`bytes.fromhex()`](#bytes.fromhex "bytes.fromhex") 現在會忽略所有 ASCII 空白符而不只是空格符。
存在一個反向轉換函數,可以將 bytes 對象轉換為對應的十六進制表示。
`hex`()返回一個字符串對象,該對象包含實例中每個字節的兩個十六進制數字。
```
>>> b'\xf0\xf1\xf2'.hex()
'f0f1f2'
```
3\.5 新版功能.
由于 bytes 對象是由整數構成的序列(類似于元組),因此對于一個 bytes 對象 *b*,`b[0]` 將為一個整數,而 `b[0:1]` 將為一個長度為 1 的 bytes 對象。 (這與文本字符串不同,索引和切片所產生的將都是一個長度為 1 的字符串)。
bytes 對象的表示使用字面值格式 (`b'...'`),因為它通常都要比像 `bytes([46, 46, 46])` 這樣的格式更好用。 你總是可以使用 `list(b)` 將 bytes 對象轉換為一個由整數構成的列表。
注解
針對 Python 2.x 用戶的說明:在 Python 2.x 系列中,允許 8 位字符串( 2.x 所提供的最接近內置二進制數據類型的對象)與 Unicode 字符串進行各種隱式轉換。 這是為了實現向下兼容的變通做法,以適應 Python 最初只支持 8 位文本而 Unicode 文本是后來才被加入這一事實。 在 Python 3.x 中,這些隱式轉換已被取消 —— 8 位二進制數據與 Unicode 文本間的轉換必須顯式地進行,bytes 與字符串對象的比較結果將總是不相等。
### bytearray 對象
[`bytearray`](#bytearray "bytearray") 對象是 [`bytes`](#bytes "bytes") 對象的可變對應物。
*class* `bytearray`(\[*source*\[, *encoding*\[, *errors*\]\]\])bytearray 對象沒有專屬的字面值語法,它們總是通過調用構造器來創建:
- 創建一個空實例: `bytearray()`
- 創建一個指定長度的以零值填充的實例: `bytearray(10)`
- 通過由整數組成的可迭代對象: `bytearray(range(20))`
- 通過緩沖區協議復制現有的二進制數據: `bytearray(b'Hi!')`
由于 bytearray 對象是可變的,該對象除了 [bytes 和 bytearray 操作](#bytes-methods) 中所描述的 bytes 和 bytearray 共有操作之外,還支持 [可變](#typesseq-mutable) 序列操作。
另請參見 [bytearray](functions.xhtml#func-bytearray) 內置類型。
由于兩個十六進制數碼精確對應一個字節,因此十六進制數是描述二進制數據的常用格式。 相應地,bytearray 類型具有從此種格式讀取數據的附加類方法:
*classmethod* `fromhex`(*string*)[`bytearray`](#bytearray "bytearray") 類方法返回一個解碼給定字符串的 bytearray 對象。 字符串必須由表示每個字節的兩個十六進制數碼構成,其中的 ASCII 空白符會被忽略。
```
>>> bytearray.fromhex('2Ef0 F1f2 ')
bytearray(b'.\xf0\xf1\xf2')
```
在 3.7 版更改: [`bytearray.fromhex()`](#bytearray.fromhex "bytearray.fromhex") 現在會忽略所有 ASCII 空白符而不只是空格符。
存在一個反向轉換函數,可以將 bytearray 對象轉換為對應的十六進制表示。
`hex`()返回一個字符串對象,該對象包含實例中每個字節的兩個十六進制數字。
```
>>> bytearray(b'\xf0\xf1\xf2').hex()
'f0f1f2'
```
3\.5 新版功能.
由于 bytearray 對象是由整數構成的序列(類似于列表),因此對于一個 bytearray 對象 *b*,`b[0]` 將為一個整數,而 `b[0:1]` 將為一個長度為 1 的 bytearray 對象。 (這與文本字符串不同,索引和切片所產生的將都是一個長度為 1 的字符串)。
bytearray 對象的表示使用 bytes 對象字面值格式 (`bytearray(b'...')`),因為它通常都要比 `bytearray([46, 46, 46])` 這樣的格式更好用。 你總是可以使用 `list(b)` 將 bytearray 對象轉換為一個由整數構成的列表。
### bytes 和 bytearray 操作
bytes 和 bytearray 對象都支持 [通用](#typesseq-common) 序列操作。 它們不僅能與相同類型的操作數,也能與任何 [bytes-like object](../glossary.xhtml#term-bytes-like-object) 進行互操作。 由于這樣的靈活性,它們可以在操作中自由地混合而不會導致錯誤。 但是,操作結果的返回值類型可能取決于操作數的順序。
注解
bytes 和 bytearray 對象的方法不接受字符串作為其參數,就像字符串的方法不接受 bytes 對象作為其參數一樣。 例如,你必須使用以下寫法:
```
a = "abc"
b = a.replace("a", "f")
```
和:
```
a = b"abc"
b = a.replace(b"a", b"f")
```
某些 bytes 和 bytearray 操作假定使用兼容 ASCII 的二進制格式,因此在處理任意二進數數據時應當避免使用。 這些限制會在下文中說明。
注解
使用這些基于 ASCII 的操作來處理未以基于 ASCII 的格式存儲的二進制數據可能會導致數據損壞。
bytes 和 bytearray 對象的下列方法可以用于任意二進制數據。
`bytes.``count`(*sub*\[, *start*\[, *end*\]\])`bytearray.``count`(*sub*\[, *start*\[, *end*\]\])返回子序列 *sub* 在 \[*start*, *end*\] 范圍內非重疊出現的次數。 可選參數 *start* 與 *end* 會被解讀為切片表示法。
要搜索的子序列可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object) 或是 0 至 255 范圍內的整數。
在 3.3 版更改: 也接受 0 至 255 范圍內的整數作為子序列。
`bytes.``decode`(*encoding="utf-8"*, *errors="strict"*)`bytearray.``decode`(*encoding="utf-8"*, *errors="strict"*)返回從給定 bytes 解碼出來的字符串。 默認編碼為 `'utf-8'`。 可以給出 *errors* 來設置不同的錯誤處理方案。 *errors* 的默認值為 `'strict'`,表示編碼錯誤會引發 [`UnicodeError`](exceptions.xhtml#UnicodeError "UnicodeError")。 其他可用的值為 `'ignore'`, `'replace'` 以及任何其他通過 [`codecs.register_error()`](codecs.xhtml#codecs.register_error "codecs.register_error") 注冊的名稱,請參閱 [Error Handlers](codecs.xhtml#error-handlers) 小節。 要查看可用的編碼列表,請參閱 [標準編碼](codecs.xhtml#standard-encodings) 小節。
注解
將 *encoding* 參數傳給 [`str`](#str "str") 允許直接解碼任何 [bytes-like object](../glossary.xhtml#term-bytes-like-object),無須創建臨時的 bytes 或 bytearray 對象。
在 3.1 版更改: 加入了對關鍵字參數的支持。
`bytes.``endswith`(*suffix*\[, *start*\[, *end*\]\])`bytearray.``endswith`(*suffix*\[, *start*\[, *end*\]\])如果二進制數據以指定的 *suffix* 結束則返回 `True`,否則返回 `False`。 *suffix* 也可以為由多個供查找的后綴構成的元組。 如果有可選項 *start*,將從所指定位置開始檢查。 如果有可選項 *end*,將在所指定位置停止比較。
要搜索的后綴可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object)。
`bytes.``find`(*sub*\[, *start*\[, *end*\]\])`bytearray.``find`(*sub*\[, *start*\[, *end*\]\])返回子序列 *sub* 在數據中被找到的最小索引,*sub* 包含于切片 `s[start:end]` 之內。 可選參數 *start* 與 *end* 會被解讀為切片表示法。 如果 *sub* 未被找到則返回 `-1`。
要搜索的子序列可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object) 或是 0 至 255 范圍內的整數。
注解
[`find()`](#bytes.find "bytes.find") 方法應該只在你需要知道 *sub* 所在位置時使用。 要檢查 *sub* 是否為子串,請使用 [`in`](../reference/expressions.xhtml#in) 操作符:
```
>>> b'Py' in b'Python'
True
```
在 3.3 版更改: 也接受 0 至 255 范圍內的整數作為子序列。
`bytes.``index`(*sub*\[, *start*\[, *end*\]\])`bytearray.``index`(*sub*\[, *start*\[, *end*\]\])類似于 [`find()`](#bytes.find "bytes.find"),但在找不到子序列時會引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError")。
要搜索的子序列可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object) 或是 0 至 255 范圍內的整數。
在 3.3 版更改: 也接受 0 至 255 范圍內的整數作為子序列。
`bytes.``join`(*iterable*)`bytearray.``join`(*iterable*)返回一個由 *iterable* 中的二進制數據序列拼接而成的 bytes 或 bytearray 對象。 如果 *iterable* 中存在任何非 [字節類對象](../glossary.xhtml#term-bytes-like-object) 包括存在 [`str`](#str "str") 對象值則會引發 [`TypeError`](exceptions.xhtml#TypeError "TypeError")。 提供該方法的 bytes 或 bytearray 對象的內容將作為元素之間的分隔。
*static* `bytes.``maketrans`(*from*, *to*)*static* `bytearray.``maketrans`(*from*, *to*)此靜態方法返回一個可用于 [`bytes.translate()`](#bytes.translate "bytes.translate") 的轉換對照表,它將把 *from* 中的每個字符映射為 *to* 中相同位置上的字符;*from* 與 *to* 必須都是 [字節類對象](../glossary.xhtml#term-bytes-like-object) 并且具有相同的長度。
3\.1 新版功能.
`bytes.``partition`(*sep*)`bytearray.``partition`(*sep*)在 *sep* 首次出現的位置拆分序列,返回一個 3 元組,其中包含分隔符之前的部分、分隔符本身或其 bytearray 副本,以及分隔符之后的部分。 如果分隔符未找到,則返回的 3 元組中包含原序列以及兩個空的 bytes 或 bytearray 對象。
要搜索的分隔符可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object)。
`bytes.``replace`(*old*, *new*\[, *count*\])`bytearray.``replace`(*old*, *new*\[, *count*\])返回序列的副本,其中出現的所有子序列 *old* 都將被替換為 *new*。 如果給出了可選參數 *count*,則只替換前 *count* 次出現。
要搜索的子序列及其替換序列可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object)。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``rfind`(*sub*\[, *start*\[, *end*\]\])`bytearray.``rfind`(*sub*\[, *start*\[, *end*\]\])返回子序列 *sub* 在序列內被找到的最大(最右)索引,這樣 *sub* 將包含在 `s[start:end]` 當中。 可選參數 *start* 與 *end* 會被解讀為切片表示法。 如果未找到則返回 `-1`。
要搜索的子序列可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object) 或是 0 至 255 范圍內的整數。
在 3.3 版更改: 也接受 0 至 255 范圍內的整數作為子序列。
`bytes.``rindex`(*sub*\[, *start*\[, *end*\]\])`bytearray.``rindex`(*sub*\[, *start*\[, *end*\]\])類似于 [`rfind()`](#bytes.rfind "bytes.rfind"),但在子序列 *sub* 未找到時會引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError")。
要搜索的子序列可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object) 或是 0 至 255 范圍內的整數。
在 3.3 版更改: 也接受 0 至 255 范圍內的整數作為子序列。
`bytes.``rpartition`(*sep*)`bytearray.``rpartition`(*sep*)在 *sep* 最后一次出現的位置拆分序列,返回一個 3 元組,其中包含分隔符之前的部分,分隔符本身或其 bytearray 副本,以及分隔符之后的部分。 如果分隔符未找到,則返回的 3 元組中包含兩個空的 bytes 或 bytearray 對象以及原序列的副本。
要搜索的分隔符可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object)。
`bytes.``startswith`(*prefix*\[, *start*\[, *end*\]\])`bytearray.``startswith`(*prefix*\[, *start*\[, *end*\]\])如果二進制數據以指定的 *prefix* 開頭則返回 `True`,否則返回 `False`。 *prefix* 也可以為由多個供查找的前綴構成的元組。 如果有可選項 *start*,將從所指定位置開始檢查。 如果有可選項 *end*,將在所指定位置停止比較。
要搜索的前綴可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object)。
`bytes.``translate`(*table*, *delete=b''*)`bytearray.``translate`(*table*, *delete=b''*)返回原 bytes 或 bytearray 對象的副本,移除其中所有在可選參數 *delete* 中出現的 bytes,其余 bytes 將通過給定的轉換表進行映射,該轉換表必須是長度為 256 的 bytes 對象。
你可以使用 [`bytes.maketrans()`](#bytes.maketrans "bytes.maketrans") 方法來創建轉換表。
對于僅需移除字符的轉換,請將 *table* 參數設為 `None`:
```
>>> b'read this short text'.translate(None, b'aeiou')
b'rd ths shrt txt'
```
在 3.6 版更改: 現在支持將 *delete* 作為關鍵字參數。
以下 bytes 和 bytearray 對象的方法的默認行為會假定使用兼容 ASCII 的二進制格式,但通過傳入適當的參數仍然可用于任意二進制數據。 請注意本小節中所有的 bytearray 方法都 *不是* 原地執行操作,而是會產生新的對象。
`bytes.``center`(*width*\[, *fillbyte*\])`bytearray.``center`(*width*\[, *fillbyte*\])返回原對象的副本,在長度為 *width* 的序列內居中,使用指定的 *fillbyte* 填充兩邊的空位(默認使用 ASCII 空格符)。 對于 [`bytes`](#bytes "bytes") 對象,如果 *width* 小于等于 `len(s)` 則返回原序列的副本。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``ljust`(*width*\[, *fillbyte*\])`bytearray.``ljust`(*width*\[, *fillbyte*\])反回原對象的副本,在長度為 *width* 的序列中靠左對齊。 使用指定的 *fillbyte* 填充空位(默認使用 ASCII 空格符)。 對于 [`bytes`](#bytes "bytes") 對象,如果 *width* 小于等于 `len(s)` 則返回原序列的副本。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``lstrip`(\[*chars*\])`bytearray.``lstrip`(\[*chars*\])返回原序列的副本,移除指定的前導字節。 *chars* 參數為指定要移除字節值集合的二進制序列 —— 這個名稱表明此方法通常是用于 ASCII 字符。 如果省略或為 `None`,則 *chars* 參數默認移除 ASCII 空白符。 *chars* 參數并非指定單個前綴;而是會移除參數值的所有組合:
```
>>> b' spacious '.lstrip()
b'spacious '
>>> b'www.example.com'.lstrip(b'cmowz.')
b'example.com'
```
要移除的字節值二進制序列可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object)。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``rjust`(*width*\[, *fillbyte*\])`bytearray.``rjust`(*width*\[, *fillbyte*\])返回原對象的副本,在長度為 *width* 的序列中靠右對齊。 使用指定的 *fillbyte* 填充空位(默認使用 ASCII 空格符)。 對于 [`bytes`](#bytes "bytes") 對象,如果 *width* 小于等于 `len(s)` 則返回原序列的副本。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``rsplit`(*sep=None*, *maxsplit=-1*)`bytearray.``rsplit`(*sep=None*, *maxsplit=-1*)將二進制序列拆分為相同類型的子序列,使用 *sep* 作為分隔符。 如果給出了 *maxsplit*,則最多進行 *maxsplit* 次拆分,從 *最右邊* 開始。 如果 *sep* 未指定或為 `None`,任何只包含 ASCII 空白符的子序列都會被作為分隔符。 除了從右邊開始拆分,[`rsplit()`](#bytearray.rsplit "bytearray.rsplit") 的其他行為都類似于下文所述的 [`split()`](#bytearray.split "bytearray.split")。
`bytes.``rstrip`(\[*chars*\])`bytearray.``rstrip`(\[*chars*\])返回原序列的副本,移除指定的末尾字節。 *chars* 參數為指定要移除字節值集合的二進制序列 —— 這個名稱表明此方法通常是用于 ASCII 字符。 如果省略或為 `None`,則 *chars* 參數默認移除 ASCII 空白符。 *chars* 參數并非指定單個后綴;而是會移除參數值的所有組合:
```
>>> b' spacious '.rstrip()
b' spacious'
>>> b'mississippi'.rstrip(b'ipz')
b'mississ'
```
要移除的字節值二進制序列可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object)。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``split`(*sep=None*, *maxsplit=-1*)`bytearray.``split`(*sep=None*, *maxsplit=-1*)將二進制序列拆分為相同類型的子序列,使用 *sep* 作為分隔符。 如果給出了 *maxsplit* 且非負值,則最多進行 *maxsplit* 次拆分(因此,列表最多會有 `maxsplit+1` 個元素)。 如果 *maxsplit* 未指定或為 `-1`,則不限制拆分次數(進行所有可能的拆分)。
如果給出了 *sep*,則連續的分隔符不會被組合在一起而是被視為分隔空子序列 (例如 `b'1,,2'.split(b',')` 將返回 `[b'1', b'', b'2']`)。 *sep* 參數可能為一個多字節序列 (例如 `b'1<>2<>3'.split(b'<>')` 將返回 `[b'1', b'2', b'3']`)。 使用指定的分隔符拆分空序列將返回 `[b'']` 或 `[bytearray(b'')]`,具體取決于被拆分對象的類型。 *sep* 參數可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object)。
例如:
```
>>> b'1,2,3'.split(b',')
[b'1', b'2', b'3']
>>> b'1,2,3'.split(b',', maxsplit=1)
[b'1', b'2,3']
>>> b'1,2,,3,'.split(b',')
[b'1', b'2', b'', b'3', b'']
```
如果 *sep* 未指定或為 `None`,則會應用另一種拆分算法:連續的 ASCII 空白符會被視為單個分隔符,其結果將不包含序列開頭或末尾的空白符。 因此,在不指定分隔符的情況下對空序列或僅包含 ASCII 空白符的序列進行拆分將返回 `[]`。
例如:
```
>>> b'1 2 3'.split()
[b'1', b'2', b'3']
>>> b'1 2 3'.split(maxsplit=1)
[b'1', b'2 3']
>>> b' 1 2 3 '.split()
[b'1', b'2', b'3']
```
`bytes.``strip`(\[*chars*\])`bytearray.``strip`(\[*chars*\])返回原序列的副本,移除指定的開頭和末尾字節。 *chars* 參數為指定要移除字節值集合的二進制序列 —— 這個名稱表明此方法通常是用于 ASCII 字符。 如果省略或為 `None`,則 *chars* 參數默認移除 ASCII 空白符。 *chars* 參數并非指定單個前綴或后綴;而是會移除參數值的所有組合:
```
>>> b' spacious '.strip()
b'spacious'
>>> b'www.example.com'.strip(b'cmowz.')
b'example'
```
要移除的字節值二進制序列可以是任意 [bytes-like object](../glossary.xhtml#term-bytes-like-object)。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
以下 bytes 和 bytearray 對象的方法會假定使用兼容 ASCII 的二進制格式,不應當被應用于任意二進制數據。 請注意本小節中所有的 bytearray 方法都 *不是* 原地執行操作,而是會產生新的對象。
`bytes.``capitalize`()`bytearray.``capitalize`()返回原序列的副本,其中每個字節將都將被解讀為一個 ASCII 字符,并且第一個字節的字符大寫而其余的小寫。 非 ASCII 字節值將保持原樣不變。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``expandtabs`(*tabsize=8*)`bytearray.``expandtabs`(*tabsize=8*)返回序列的副本,其中所有的 ASCII 制表符會由一個或多個 ASCII 空格替換,具體取決于當前列位置和給定的制表符寬度。 每 *tabsize* 個字節設為一個制表位(默認值 8 時設定的制表位在列 0, 8, 16 依次類推)。 要展開序列,當前列位置將被設為零并逐一檢查序列中的每個字節。 如果字節為 ASCII 制表符 (`b'\t'`),則并在結果中插入一個或多個空格符,直到當前列等于下一個制表位。 (制表符本身不會被復制。) 如果當前字節為 ASCII 換行符 (`b'\n'`) 或回車符 (`b'\r'`),它會被復制并將當前列重設為零。 任何其他字節會被不加修改地復制并將當前列加一,不論該字節值在被打印時會如何顯示:
```
>>> b'01\t012\t0123\t01234'.expandtabs()
b'01 012 0123 01234'
>>> b'01\t012\t0123\t01234'.expandtabs(4)
b'01 012 0123 01234'
```
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``isalnum`()`bytearray.``isalnum`()如果序列中所有字節都是字母類 ASCII 字符或 ASCII 十進制數碼并且序列非空則返回真值,否則返回假值。 字母類 ASCII 字符就是字節值包含在序列 `b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'` 中的字符。 ASCII 十進制數碼就是字節值包含在序列 `b'0123456789'` 中的字符。
例如:
```
>>> b'ABCabc1'.isalnum()
True
>>> b'ABC abc1'.isalnum()
False
```
`bytes.``isalpha`()`bytearray.``isalpha`()如果序列中所有字節都是字母類 ASCII 字符并且序列非空則返回真值,否則返回假值。 字母類 ASCII 字符就是字節值包含在序列 `b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'` 中的字符。
例如:
```
>>> b'ABCabc'.isalpha()
True
>>> b'ABCabc1'.isalpha()
False
```
`bytes.``isascii`()`bytearray.``isascii`()如果序列為空或序列中所有字節都是 ASCII 字節則返回真值,否則返回假值。 ASCII 字節的取值范圍是 0-0x7F。
3\.7 新版功能.
`bytes.``isdigit`()`bytearray.``isdigit`()如果序列中所有字節都是 ASCII 十進制數碼并且序列非空則返回真值,否則返回假值。 ASCII 十進制數碼就是字節值包含在序列 `b'0123456789'` 中的字符。
例如:
```
>>> b'1234'.isdigit()
True
>>> b'1.23'.isdigit()
False
```
`bytes.``islower`()`bytearray.``islower`()如果序列中至少有一個小寫 ASCII 字符并且沒有大寫 ASCII 字符則返回真值,否則返回假值。
例如:
```
>>> b'hello world'.islower()
True
>>> b'Hello world'.islower()
False
```
小寫 ASCII 字符就是字節值包含在序列 `b'abcdefghijklmnopqrstuvwxyz'` 中的字符。 大寫 ASCII 字符就是字節值包含在序列 `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` 中的字符。
`bytes.``isspace`()`bytearray.``isspace`()如果序列中所有字節都是 ASCII 空白符并且序列非空則返回真值,否則返回假值。 ASCII 空白符就是字節值包含在序列 `b' \t\n\r\x0b\f'` (空格, 制表, 換行, 回車, 垂直制表, 換頁) 中的字符。
`bytes.``istitle`()`bytearray.``istitle`()如果序列為 ASCII 標題形式并且序列非空則返回真值,否則返回假值。 請參閱 [`bytes.title()`](#bytes.title "bytes.title") 了解有關“標題形式”的詳細定義。
例如:
```
>>> b'Hello World'.istitle()
True
>>> b'Hello world'.istitle()
False
```
`bytes.``isupper`()`bytearray.``isupper`()如果序列中至少有一個大寫字母 ASCII 字符并且沒有小寫 ASCII 字符則返回真值,否則返回假值。
例如:
```
>>> b'HELLO WORLD'.isupper()
True
>>> b'Hello world'.isupper()
False
```
小寫 ASCII 字符就是字節值包含在序列 `b'abcdefghijklmnopqrstuvwxyz'` 中的字符。 大寫 ASCII 字符就是字節值包含在序列 `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` 中的字符。
`bytes.``lower`()`bytearray.``lower`()返回原序列的副本,其所有大寫 ASCII 字符均轉換為對應的小寫形式。
例如:
```
>>> b'Hello World'.lower()
b'hello world'
```
小寫 ASCII 字符就是字節值包含在序列 `b'abcdefghijklmnopqrstuvwxyz'` 中的字符。 大寫 ASCII 字符就是字節值包含在序列 `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` 中的字符。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``splitlines`(*keepends=False*)`bytearray.``splitlines`(*keepends=False*)返回由原二進制序列中各行組成的列表,在 ASCII 行邊界符的位置拆分。 此方法使用 [universal newlines](../glossary.xhtml#term-universal-newlines) 方式來分行。 結果列表中不包含換行符,除非給出了 *keepends* 且為真值。
例如:
```
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines()
[b'ab c', b'', b'de fg', b'kl']
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
[b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']
```
不同于 [`split()`](#bytes.split "bytes.split"),當給出了分隔符 *sep* 時,對于空字符串此方法將返回一個空列表,而末尾的換行不會令結果中增加額外的行:
```
>>> b"".split(b'\n'), b"Two lines\n".split(b'\n')
([b''], [b'Two lines', b''])
>>> b"".splitlines(), b"One line\n".splitlines()
([], [b'One line'])
```
`bytes.``swapcase`()`bytearray.``swapcase`()返回原序列的副本,其所有小寫 ASCII 字符均轉換為對應的大寫形式,反之亦反。
例如:
```
>>> b'Hello World'.swapcase()
b'hELLO wORLD'
```
小寫 ASCII 字符就是字節值包含在序列 `b'abcdefghijklmnopqrstuvwxyz'` 中的字符。 大寫 ASCII 字符就是字節值包含在序列 `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` 中的字符。
不同于 [`str.swapcase()`](#str.swapcase "str.swapcase"),在些二進制版本下 `bin.swapcase().swapcase() == bin` 總是成立。 大小寫轉換在 ASCII 中是對稱的,即使其對于任意 Unicode 碼位來說并不總是成立。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``title`()`bytearray.``title`()返回原二進制序列的標題版本,其中每個單詞以一個大寫 ASCII 字符為開頭,其余字母為小寫。 不區別大小寫的字節值將保持原樣不變。
例如:
```
>>> b'Hello world'.title()
b'Hello World'
```
小寫 ASCII 字符就是字節值包含在序列 `b'abcdefghijklmnopqrstuvwxyz'` 中的字符。 大寫 ASCII 字符就是字節值包含在序列 `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` 中的字符。 所有其他字節值都不區分大小寫。
該算法使用一種簡單的與語言無關的定義,將連續的字母組合視為單詞。 該定義在多數情況下都很有效,但它也意味著代表縮寫形式與所有格的撇號也會成為單詞邊界,這可能導致不希望的結果:
```
>>> b"they're bill's friends from the UK".title()
b"They'Re Bill'S Friends From The Uk"
```
可以使用正則表達式來構建針對撇號的特別處理:
```
>>> import re
>>> def titlecase(s):
... return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?",
... lambda mo: mo.group(0)[0:1].upper() +
... mo.group(0)[1:].lower(),
... s)
...
>>> titlecase(b"they're bill's friends.")
b"They're Bill's Friends."
```
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``upper`()`bytearray.``upper`()返回原序列的副本,其所有小寫 ASCII 字符均轉換為對應的大寫形式。
例如:
```
>>> b'Hello World'.upper()
b'HELLO WORLD'
```
小寫 ASCII 字符就是字節值包含在序列 `b'abcdefghijklmnopqrstuvwxyz'` 中的字符。 大寫 ASCII 字符就是字節值包含在序列 `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` 中的字符。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
`bytes.``zfill`(*width*)`bytearray.``zfill`(*width*)返回原序列的副本,在左邊填充 `b'0'` 數碼使序列長度為 *width*。 正負值前綴 (`b'+'`/ `b'-'`) 的處理方式是在正負符號 *之后* 填充而非在之前。 對于 [`bytes`](#bytes "bytes") 對象,如果 *width* 小于等于 `len(seq)` 則返回原序列。
例如:
```
>>> b"42".zfill(5)
b'00042'
>>> b"-42".zfill(5)
b'-0042'
```
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
### `printf` 風格的字節串格式化
注解
此處介紹的格式化操作具有多種怪異特性,可能導致許多常見錯誤(例如無法正確顯示元組和字典)。 如果要打印的值可能為元組或字典,請將其放入一個元組中。
字節串對象 (`bytes`/`bytearray`) 具有一種特殊的內置操作:使用 `%` (取模) 運算符。 這也被稱為字節串的 *格式化* 或 *插值* 運算符。 對于 `format % values` (其中 *format* 為一個字節串對象),在 *format* 中的 `%` 轉換標記符將被替換為零個或多個 *values* 條目。 其效果類似于在 C 語言中使用 `sprintf()`。
如果 *format* 要求一個單獨參數,則 *values* 可以為一個非元組對象。 [5](#id16) 否則的話,*values* 必須或是是一個包含項數與格式字節串對象中指定的轉換符項數相同的元組,或者是一個單獨的映射對象(例如元組)。
轉換標記符包含兩個或更多字符并具有以下組成,且必須遵循此處規定的順序:
1. `'%'` 字符,用于標記轉換符的起始。
2. 映射鍵(可選),由加圓括號的字符序列組成 (例如 `(somename)`)。
3. 轉換旗標(可選),用于影響某些轉換類型的結果。
4. 最小字段寬度(可選)。 如果指定為 `'*'` (星號),則實際寬度會從 *values* 元組的下一元素中讀取,要轉換的對象則為最小字段寬度和可選的精度之后的元素。
5. 精度(可選),以在 `'.'` (點號) 之后加精度值的形式給出。 如果指定為 `'*'` (星號),則實際精度會從 *values* 元組的下一元素中讀取,要轉換的對象則為精度之后的元素。
6. 長度修飾符(可選)。
7. 轉換類型。
當右邊的參數為一個字典(或其他映射類型)時,字節串對象中的格式 *必須* 包含加圓括號的映射鍵,對應 `'%'` 字符之后字典中的每一項。 映射鍵將從映射中選取要格式化的值。 例如:
```
>>> print(b'%(language)s has %(number)03d quote types.' %
... {b'language': b"Python", b"number": 2})
b'Python has 002 quote types.'
```
在此情況下格式中不能出現 `*` 標記符(因其需要一個序列類的參數列表)。
轉換旗標為:
標志
含義
`'#'`
值的轉換將使用“替代形式”(具體定義見下文)。
`'0'`
轉換將為數字值填充零字符。
`'-'`
轉換值將靠左對齊(如果同時給出 `'0'` 轉換,則會覆蓋后者)。
`' '`
(空格) 符號位轉換產生的正數(或空字符串)前將留出一個空格。
`'+'`
符號字符 (`'+'` 或 `'-'`) 將顯示于轉換結果的開頭(會覆蓋 "空格" 旗標)。
可以給出長度修飾符 (`h`, `l` 或 `L`),但會被忽略,因為對 Python 來說沒有必要 -- 所以 `%ld` 等價于 `%d`。
轉換類型為:
轉換符
含義
注釋
`'d'`
有符號十進制整數。
`'i'`
有符號十進制整數。
`'o'`
有符號八進制數。
(1)
`'u'`
過時類型 -- 等價于 `'d'`。
(8)
`'x'`
有符號十六進制數(小寫)。
(2)
`'X'`
有符號十六進制數(大寫)。
(2)
`'e'`
浮點指數格式(小寫)。
(3)
`'E'`
浮點指數格式(大寫)。
(3)
`'f'`
浮點十進制格式。
(3)
`'F'`
浮點十進制格式。
(3)
`'g'`
浮點格式。 如果指數小于 -4 或不小于精度則使用小寫指數格式,否則使用十進制格式。
(4)
`'G'`
浮點格式。 如果指數小于 -4 或不小于精度則使用大寫指數格式,否則使用十進制格式。
(4)
`'c'`
單個字節(接受整數或單個字節對象)。
`'b'`
字節串(任何遵循 [緩沖區協議](../c-api/buffer.xhtml#bufferobjects) 或是具有 [`__bytes__()`](../reference/datamodel.xhtml#object.__bytes__ "object.__bytes__") 的對象)。
(5)
`'s'`
`'s'` 是 `'b'` 的一個別名,只應當在基于 Python2/3 的代碼中使用。
(6)
`'a'`
字節串(使用 `repr(obj).encode('ascii','backslashreplace)` 轉換任何 Python 對象)。
(5)
`'r'`
`'r'` 是 `'a'` 的一個別名,只應當在基于 Python2/3 的代碼中使用。
(7)
`'%'`
不轉換參數,在結果中輸出一個 `'%'` 字符。
注釋:
1. 此替代形式會在第一個數碼之前插入標示八進制數的前綴 (`'0o'`)。
2. 此替代形式會在第一個數碼之前插入 `'0x'` 或 `'0X'` 前綴(取決于是使用 `'x'` 還是 `'X'` 格式)。
3. 此替代形式總是會在結果中包含一個小數點,即使其后并沒有數碼。
小數點后的數碼位數由精度決定,默認為 6。
4. 此替代形式總是會在結果中包含一個小數點,末尾各位的零不會如其他情況下那樣被移除。
小數點前后的有效數碼位數由精度決定,默認為 6。
5. 如果精度為 `N`,輸出將截短為 `N` 個字符。
6. `b'%s'` 已棄用,但在 3.x 系列中將不會被移除。
7. `b'%r'` 已棄用,但在 3.x 系列中將不會被移除。
8. 參見 [**PEP 237**](https://www.python.org/dev/peps/pep-0237) \[https://www.python.org/dev/peps/pep-0237\]。
注解
此方法的 bytearray 版本 *并非* 原地操作 —— 它總是產生一個新對象,即便沒有做任何改變。
參見
[**PEP 461**](https://www.python.org/dev/peps/pep-0461) \[https://www.python.org/dev/peps/pep-0461\] - 為 bytes 和 bytearray 添加 % 格式化
3\.5 新版功能.
### 內存視圖
[`memoryview`](#memoryview "memoryview") 對象允許 Python 代碼訪問一個對象的內部數據,只要該對象支持 [緩沖區協議](../c-api/buffer.xhtml#bufferobjects) 而無需進行拷貝。
*class* `memoryview`(*obj*)創建一個引用 *obj* 的 [`memoryview`](#memoryview "memoryview")。 *obj* 必須支持緩沖區協議。 支持緩沖區協議的內置對象包括 [`bytes`](#bytes "bytes") 和 [`bytearray`](#bytearray "bytearray")。
[`memoryview`](#memoryview "memoryview") 具有 *元素* 的概念,即由原始對象 *obj* 所處理的基本內存單元。 對于許多簡單類型例如 [`bytes`](#bytes "bytes") 和 [`bytearray`](#bytearray "bytearray") 來說,一個元素就是一個字節,但是其他的類型例如 [`array.array`](array.xhtml#array.array "array.array") 可能有更大的元素。
`len(view)` 與 [`tolist`](#memoryview.tolist "memoryview.tolist") 的長度相等。 如果 `view.ndim = 0`,則其長度為 1。 如果 `view.ndim = 1`,則其長度等于 view 中元素的數量。 對于更高的維度,其長度等于表示 view 的嵌套列表的長度。 [`itemsize`](#memoryview.itemsize "memoryview.itemsize") 屬性可向你給出單個元素所占的字節數。
[`memoryview`](#memoryview "memoryview") 支持通過切片和索引訪問其元素。 一維切片的結果將是一個子視圖:
```
>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'
```
如果 [`format`](#memoryview.format "memoryview.format") 是一個來自于 [`struct`](struct.xhtml#module-struct "struct: Interpret bytes as packed binary data.") 模塊的原生格式說明符,則也支持使用整數或由整數構成的元組進行索引,并返回具有正確類型的單個 *元素*。 一維內存視圖可以使用一個整數或由一個整數構成的元組進行索引。 多維內存視圖可以使用由恰好 *ndim* 個整數構成的元素進行索引,*ndim* 即其維度。 零維內存視圖可以使用空元組進行索引。
這里是一個使用非字節格式的例子:
```
>>> import array
>>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])
>>> m = memoryview(a)
>>> m[0]
-11111111
>>> m[-1]
44444444
>>> m[::2].tolist()
[-11111111, -33333333]
```
如果下層對象是可寫的,則內存視圖支持一維切片賦值。 改變大小則不被允許:
```
>>> data = bytearray(b'abcefg')
>>> v = memoryview(data)
>>> v.readonly
False
>>> v[0] = ord(b'z')
>>> data
bytearray(b'zbcefg')
>>> v[1:4] = b'123'
>>> data
bytearray(b'z123fg')
>>> v[2:3] = b'spam'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: memoryview assignment: lvalue and rvalue have different structures
>>> v[2:6] = b'spam'
>>> data
bytearray(b'z1spam')
```
由帶有格式符號 'B', 'b' 或 'c' 的可哈希(只讀)類型構成的一維內存視圖同樣是可哈希的。 哈希定義為 `hash(m) == hash(m.tobytes())`:
```
>>> v = memoryview(b'abcefg')
>>> hash(v) == hash(b'abcefg')
True
>>> hash(v[2:4]) == hash(b'ce')
True
>>> hash(v[::-2]) == hash(b'abcefg'[::-2])
True
```
在 3.3 版更改: 一維內存視圖現在可以被切片。 帶有格式符號 'B', 'b' 或 'c' 的一維內存視圖現在是可哈希的。
在 3.4 版更改: 內存視圖現在會自動注冊為 [`collections.abc.Sequence`](collections.abc.xhtml#collections.abc.Sequence "collections.abc.Sequence")
在 3.5 版更改: 內存視圖現在可使用整數元組進行索引。
[`memoryview`](#memoryview "memoryview") 具有以下一些方法:
`__eq__`(*exporter*)memoryview 與 [**PEP 3118**](https://www.python.org/dev/peps/pep-3118) \[https://www.python.org/dev/peps/pep-3118\] 中的導出器這兩者如果形狀相同,并且如果當使用 [`struct`](struct.xhtml#module-struct "struct: Interpret bytes as packed binary data.") 語法解讀操作數的相應格式代碼時所有對應值都相同,則它們就是等價的。
對于 [`tolist()`](#memoryview.tolist "memoryview.tolist") 當前所支持的 [`struct`](struct.xhtml#module-struct "struct: Interpret bytes as packed binary data.") 格式字符串子集,如果 `v.tolist() == w.tolist()` 則 `v` 和 `w` 相等:
```
>>> import array
>>> a = array.array('I', [1, 2, 3, 4, 5])
>>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])
>>> c = array.array('b', [5, 3, 1])
>>> x = memoryview(a)
>>> y = memoryview(b)
>>> x == a == y == b
True
>>> x.tolist() == a.tolist() == y.tolist() == b.tolist()
True
>>> z = y[::-2]
>>> z == c
True
>>> z.tolist() == c.tolist()
True
```
如果兩邊的格式字符串都不被 [`struct`](struct.xhtml#module-struct "struct: Interpret bytes as packed binary data.") 模塊所支持,則兩對象比較結果總是不相等(即使格式字符串和緩沖區內容相同):
```
>>> from ctypes import BigEndianStructure, c_long
>>> class BEPoint(BigEndianStructure):
... _fields_ = [("x", c_long), ("y", c_long)]
...
>>> point = BEPoint(100, 200)
>>> a = memoryview(point)
>>> b = memoryview(point)
>>> a == point
False
>>> a == b
False
```
請注意,與浮點數的情況一樣,對于內存視圖對象來說,`v is w` 也 *并不* 意味著 `v == w`。
在 3.3 版更改: 之前的版本比較原始內存時會忽略條目的格式與邏輯數組結構。
`tobytes`()將緩沖區中的數據作為字節串返回。 這相當于在內存視圖上調用 [`bytes`](#bytes "bytes") 構造器。
```
>>> m = memoryview(b"abc")
>>> m.tobytes()
b'abc'
>>> bytes(m)
b'abc'
```
對于非連續數組,結果等于平面化表示的列表,其中所有元素都轉換為字節串。 [`tobytes()`](#memoryview.tobytes "memoryview.tobytes") 支持所有格式字符串,不符合 [`struct`](struct.xhtml#module-struct "struct: Interpret bytes as packed binary data.") 模塊語法的那些也包括在內。
`hex`()返回一個字符串對象,其中分別以兩個十六進制數碼表示緩沖區里的每個字節。
```
>>> m = memoryview(b"abc")
>>> m.hex()
'616263'
```
3\.5 新版功能.
`tolist`()將緩沖區內的數據以一個元素列表的形式返回。
```
>>> memoryview(b'abc').tolist()
[97, 98, 99]
>>> import array
>>> a = array.array('d', [1.1, 2.2, 3.3])
>>> m = memoryview(a)
>>> m.tolist()
[1.1, 2.2, 3.3]
```
在 3.3 版更改: [`tolist()`](#memoryview.tolist "memoryview.tolist") 現在支持 [`struct`](struct.xhtml#module-struct "struct: Interpret bytes as packed binary data.") 模塊語法中的所有單字符原生格式以及多維表示形式。
`release`()釋放由內存視圖對象所公開的底層緩沖區。 許多對象在被視圖所獲取時都會采取特殊動作(例如,[`bytearray`](#bytearray "bytearray") 將會暫時禁止調整大小);因此,調用 release() 可以方便地盡早去除這些限制(并釋放任何多余的資源)。
在此方法被調用后,任何對視圖的進一步操作將引發 [`ValueError`](exceptions.xhtml#ValueError "ValueError") ([`release()`](#memoryview.release "memoryview.release") 本身除外,它可以被多次調用):
```
>>> m = memoryview(b'abc')
>>> m.release()
>>> m[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object
```
使用 `with` 語句,可以通過上下文管理協議達到類似的效果:
```
>>> with memoryview(b'abc') as m:
... m[0]
...
97
>>> m[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object
```
3\.2 新版功能.
`cast`(*format*\[, *shape*\])將內存視圖轉化為新的格式或形狀。 *shape* 默認為 `[byte_length//new_itemsize]`,這意味著結果視圖將是一維的。 返回值是一個新的內存視圖,但緩沖區本身不會被復制。 支持的轉化有 1D -> C-[contiguous](../glossary.xhtml#term-contiguous) 和 C-contiguous -> 1D。
目標格式僅限于 [`struct`](struct.xhtml#module-struct "struct: Interpret bytes as packed binary data.") 語法中的單一元素原生格式。 其中一種格式必須為字節格式 ('B', 'b' 或 'c')。 結果的字節長度必須與原始長度相同。
將 1D/long 轉換為 1D/unsigned bytes:
```
>>> import array
>>> a = array.array('l', [1,2,3])
>>> x = memoryview(a)
>>> x.format
'l'
>>> x.itemsize
8
>>> len(x)
3
>>> x.nbytes
24
>>> y = x.cast('B')
>>> y.format
'B'
>>> y.itemsize
1
>>> len(y)
24
>>> y.nbytes
24
```
將 1D/unsigned bytes 轉換為 1D/char:
```
>>> b = bytearray(b'zyz')
>>> x = memoryview(b)
>>> x[0] = b'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: memoryview: invalid value for format "B"
>>> y = x.cast('c')
>>> y[0] = b'a'
>>> b
bytearray(b'ayz')
```
將 1D/bytes 轉換為 3D/ints 再轉換為 1D/signed char:
```
>>> import struct
>>> buf = struct.pack("i"*12, *list(range(12)))
>>> x = memoryview(buf)
>>> y = x.cast('i', shape=[2,2,3])
>>> y.tolist()
[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
>>> y.format
'i'
>>> y.itemsize
4
>>> len(y)
2
>>> y.nbytes
48
>>> z = y.cast('b')
>>> z.format
'b'
>>> z.itemsize
1
>>> len(z)
48
>>> z.nbytes
48
```
將 1D/unsigned char 轉換為 2D/unsigned long:
```
>>> buf = struct.pack("L"*6, *list(range(6)))
>>> x = memoryview(buf)
>>> y = x.cast('L', shape=[2,3])
>>> len(y)
2
>>> y.nbytes
48
>>> y.tolist()
[[0, 1, 2], [3, 4, 5]]
```
3\.3 新版功能.
在 3.5 版更改: 當轉換為字節視圖時,源格式將不再受限。
還存在一些可用的只讀屬性:
`obj`內存視圖的下層對象:
```
>>> b = bytearray(b'xyz')
>>> m = memoryview(b)
>>> m.obj is b
True
```
3\.3 新版功能.
`nbytes``nbytes == product(shape) * itemsize == len(m.tobytes())`。 這是數組在連續表示時將會占用的空間總字節數。 它不一定等于 `len(m)`:
```
>>> import array
>>> a = array.array('i', [1,2,3,4,5])
>>> m = memoryview(a)
>>> len(m)
5
>>> m.nbytes
20
>>> y = m[::2]
>>> len(y)
3
>>> y.nbytes
12
>>> len(y.tobytes())
12
```
多維數組:
```
>>> import struct
>>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)])
>>> x = memoryview(buf)
>>> y = x.cast('d', shape=[3,4])
>>> y.tolist()
[[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]
>>> len(y)
3
>>> y.nbytes
96
```
3\.3 新版功能.
`readonly`一個表明內存是否只讀的布爾值。
`format`一個字符串,包含視圖中每個元素的格式(表示為 [`struct`](struct.xhtml#module-struct "struct: Interpret bytes as packed binary data.") 模塊樣式)。 內存視圖可以從具有任意格式字符串的導出器創建,但某些方法 (例如 [`tolist()`](#memoryview.tolist "memoryview.tolist")) 僅限于原生的單元素格式。
在 3.3 版更改: 格式 `'B'` 現在會按照 struct 模塊語法來處理。 這意味著 `memoryview(b'abc')[0] == b'abc'[0] == 97`。
`itemsize`memoryview 中每個元素以字節表示的大小:
```
>>> import array, struct
>>> m = memoryview(array.array('H', [32000, 32001, 32002]))
>>> m.itemsize
2
>>> m[0]
32000
>>> struct.calcsize('H') == m.itemsize
True
```
`ndim`一個整數,表示內存所代表的多維數組具有多少個維度。
`shape`一個整數元組,通過 [`ndim`](#memoryview.ndim "memoryview.ndim") 的長度值給出內存所代表的 N 維數組的形狀。
在 3.3 版更改: 當 ndim = 0 時值為空元組而不再為 `None`。
`strides`一個整數元組,通過 [`ndim`](#memoryview.ndim "memoryview.ndim") 的長度給出以字節表示的大小,以便訪問數組中每個維度上的每個元素。
在 3.3 版更改: 當 ndim = 0 時值為空元組而不再為 `None`。
`suboffsets`供 PIL 風格的數組內部使用。 該值僅作為參考信息。
`c_contiguous`一個表明內存是否為 C-[contiguous](../glossary.xhtml#term-contiguous) 的布爾值。
3\.3 新版功能.
`f_contiguous`一個表明內存是否為 Fortran [contiguous](../glossary.xhtml#term-contiguous) 的布爾值。
3\.3 新版功能.
`contiguous`一個表明內存是否為 [contiguous](../glossary.xhtml#term-contiguous) 的布爾值。
3\.3 新版功能.
## 集合類型 --- [`set`](#set "set"), [`frozenset`](#frozenset "frozenset")
*set* 對象是由具有唯一性的 [hashable](../glossary.xhtml#term-hashable) 對象所組成的無序多項集。 常見的用途包括成員檢測、從序列中去除重復項以及數學中的集合類計算,例如交集、并集、差集與對稱差集等等。 (關于其他容器對象請參看 [`dict`](#dict "dict"), [`list`](#list "list") 與 [`tuple`](#tuple "tuple") 等內置類,以及 [`collections`](collections.xhtml#module-collections "collections: Container datatypes") 模塊。)
與其他多項集一樣,集合也支持 `x in set`, `len(set)` 和 `for x in set`。 作為一種無序的多項集,集合并不記錄元素位置或插入順序。 相應地,集合不支持索引、切片或其他序列類的操作。
目前有兩種內置集合類型,[`set`](#set "set") 和 [`frozenset`](#frozenset "frozenset")。 [`set`](#set "set") 類型是可變的 --- 其內容可以使用 `add()` 和 `remove()` 這樣的方法來改變。 由于是可變類型,它沒有哈希值,且不能被用作字典的鍵或其他集合的元素。 [`frozenset`](#frozenset "frozenset") 類型是不可變并且為 [hashable](../glossary.xhtml#term-hashable) --- 其內容在被創建后不能再改變;因此它可以被用作字典的鍵或其他集合的元素。
除了可以使用 [`set`](#set "set") 構造器,非空的 set (不是 frozenset) 還可以通過將以逗號分隔的元素列表包含于花括號之內來創建,例如: `{'jack', 'sjoerd'}`。
兩個類的構造器具有相同的作用方式:
*class* `set`(\[*iterable*\])*class* `frozenset`(\[*iterable*\])返回一個新的 set 或 frozenset 對象,其元素來自于 *iterable*。 集合的元素必須為 [hashable](../glossary.xhtml#term-hashable)。 要表示由集合對象構成的集合,所有的內層集合必須為 [`frozenset`](#frozenset "frozenset") 對象。 如果未指定 *iterable*,則將返回一個新的空集合。
[`set`](#set "set") 和 [`frozenset`](#frozenset "frozenset") 的實例提供以下操作:
`len(s)`返回集合 *s* 中的元素數量(即 *s* 的基數)。
`x in s`檢測 *x* 是否為 *s* 中的成員。
`x not in s`檢測 *x* 是否非 *s* 中的成員。
`isdisjoint`(*other*)如果集合中沒有與 *other* 共有的元素則返回 `True`。 當且僅當兩個集合的交集為空集合時,兩者為不相交集合。
`issubset`(*other*)`set <= other`檢測是否集合中的每個元素都在 *other* 之中。
`set < other`檢測集合是否為 *other* 的真子集,即 `set <= other and set != other`。
`issuperset`(*other*)`set >= other`檢測是否 *other* 中的每個元素都在集合之中。
`set > other`檢測集合是否為 *other* 的真超集,即 `set >= other and set != other`。
`union`(*\*others*)`set | other | ...`返回一個新集合,其中包含來自原集合以及 others 指定的所有集合中的元素。
`intersection`(*\*others*)`set & other & ...`返回一個新集合,其中包含原集合以及 others 指定的所有集合中共有的元素。
`difference`(*\*others*)`set - other - ...`返回一個新集合,其中包含原集合中在 others 指定的其他集合中不存在的元素。
`symmetric_difference`(*other*)`set ^ other`返回一個新集合,其中的元素或屬于原集合或屬于 *other* 指定的其他集合,但不能同時屬于兩者。
`copy`()返回原集合的淺拷貝。
請注意,非運算符版本的 [`union()`](#frozenset.union "frozenset.union"), [`intersection()`](#frozenset.intersection "frozenset.intersection"), [`difference()`](#frozenset.difference "frozenset.difference"),以及 [`symmetric_difference()`](#frozenset.symmetric_difference "frozenset.symmetric_difference"), [`issubset()`](#frozenset.issubset "frozenset.issubset") 和 [`issuperset()`](#frozenset.issuperset "frozenset.issuperset") 方法會接受任意可迭代對象作為參數。 相比之下,它們所對應的運算符版本則要求其參數為集合。 這就排除了容易出錯的構造形式例如 `set('abc') & 'cbs'`,而推薦可讀性更強的 `set('abc').intersection('cbs')`。
[`set`](#set "set") 和 [`frozenset`](#frozenset "frozenset") 均支持集合與集合的比較。 兩個集合當且僅當每個集合中的每個元素均包含于另一個集合之內(即各為對方的子集)時則相等。 一個集合當且僅當其為另一個集合的真子集(即為后者的子集但兩者不相等)時則小于另一個集合。 一個集合當且僅當其為另一個集合的真超集(即為后者的超集但兩者不相等)時則大于另一個集合。
[`set`](#set "set") 的實例與 [`frozenset`](#frozenset "frozenset") 的實例之間基于它們的成員進行比較。 例如 `set('abc') == frozenset('abc')` 返回 `True`,`set('abc') in set([frozenset('abc')])` 也一樣。
子集與相等比較并不能推廣為完全排序函數。 例如,任意兩個非空且不相交的集合不相等且互不為對方的子集,因此以下 *所有* 比較均返回 `False`: `a<b`, `a==b`, or `a>b`。
由于集合僅定義了部分排序(子集關系),因此由集合構成的列表 [`list.sort()`](#list.sort "list.sort") 方法的輸出并無定義。
集合的元素,與字典的鍵類似,必須為 [hashable](../glossary.xhtml#term-hashable)。
混合了 [`set`](#set "set") 實例與 [`frozenset`](#frozenset "frozenset") 的二進制位運算將返回與第一個操作數相同的類型。例如: `frozenset('ab') | set('bc')` 將返回 [`frozenset`](#frozenset "frozenset") 的實例。
下表列出了可用于 [`set`](#set "set") 而不能用于不可變的 [`frozenset`](#frozenset "frozenset") 實例的操作:
`update`(*\*others*)`set |= other | ...`更新集合,添加來自 others 中的所有元素。
`intersection_update`(*\*others*)`set &= other & ...`更新集合,只保留其中在所有 others 中也存在的元素。
`difference_update`(*\*others*)`set -= other | ...`更新集合,移除其中也存在于 others 中的元素。
`symmetric_difference_update`(*other*)`set ^= other`更新集合,只保留存在于集合的一方而非共同存在的元素。
`add`(*elem*)將元素 *elem* 添加到集合中。
`remove`(*elem*)從集合中移除元素 *elem*。 如果 *elem* 不存在于集合中則會引發 [`KeyError`](exceptions.xhtml#KeyError "KeyError")。
`discard`(*elem*)如果元素 *elem* 存在于集合中則將其移除。
`pop`()從集合中移除并返回任意一個元素。 如果集合為空則會引發 [`KeyError`](exceptions.xhtml#KeyError "KeyError")。
`clear`()從集合中移除所有元素。
請注意,非運算符版本的 [`update()`](#frozenset.update "frozenset.update"), [`intersection_update()`](#frozenset.intersection_update "frozenset.intersection_update"), [`difference_update()`](#frozenset.difference_update "frozenset.difference_update") 和 [`symmetric_difference_update()`](#frozenset.symmetric_difference_update "frozenset.symmetric_difference_update") 方法將接受任意可迭代對象作為參數。
請注意,[`__contains__()`](../reference/datamodel.xhtml#object.__contains__ "object.__contains__"), [`remove()`](#frozenset.remove "frozenset.remove") 和 [`discard()`](#frozenset.discard "frozenset.discard") 方法的 *elem* 參數可能是一個 set。 為支持對一個等價的 frozenset 進行搜索,會根據 *elem* 臨時創建一個該類型對象。
## 映射類型 --- [`dict`](#dict "dict")
[mapping](../glossary.xhtml#term-mapping) 對象會將 [hashable](../glossary.xhtml#term-hashable) 值映射到任意對象。 映射屬于可變對象。 目前僅有一種標準映射類型 *字典*。 (關于其他容器對象請參看 [`list`](#list "list"), [`set`](#set "set") 與 [`tuple`](#tuple "tuple") 等內置類,以及 [`collections`](collections.xhtml#module-collections "collections: Container datatypes") 模塊。)
字典的鍵 *幾乎* 可以是任何值。 非 [hashable](../glossary.xhtml#term-hashable) 的值,即包含列表、字典或其他可變類型的值(此類對象基于值而非對象標識進行比較)不可用作鍵。 數字類型用作鍵時遵循數字比較的一般規則:如果兩個數值相等 (例如 `1` 和 `1.0`) 則兩者可以被用來索引同一字典條目。 (但是請注意,由于計算機對于浮點數存儲的只是近似值,因此將其用作字典鍵是不明智的。)
字典可以通過將以逗號分隔的 `鍵: 值` 對列表包含于花括號之內來創建,例如: `{'jack': 4098, 'sjoerd': 4127}` 或 `{4098: 'jack', 4127: 'sjoerd'}`,也可以通過 [`dict`](#dict "dict") 構造器來創建。
*class* `dict`(*\*\*kwarg*)*class* `dict`(*mapping*, *\*\*kwarg*)*class* `dict`(*iterable*, *\*\*kwarg*)返回一個新的字典,基于可選的位置參數和可能為空的關鍵字參數集來初始化。
如果沒有給出位置參數,將創建一個空字典。 如果給出一個位置參數并且其屬于映射對象,將創建一個具有與映射對象相同鍵值對的字典。 否則的話,位置參數必須為一個 [iterable](../glossary.xhtml#term-iterable) 對象。 該可迭代對象中的每一項本身必須為一個剛好包含兩個元素的可迭代對象。 每一項中的第一個對象將成為新字典的一個鍵,第二個對象將成為其對應的值。 如果一個鍵出現一次以上,該鍵的最后一個值將成為其在新字典中對應的值。
如果給出了關鍵字參數,則關鍵字參數及其值會被加入到基于位置參數創建的字典。 如果要加入的鍵已存在,來自關鍵字參數的值將替代來自位置參數的值。
作為演示,以下示例返回的字典均等于 `{"one": 1, "two": 2, "three": 3}`:
```
>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>> a == b == c == d == e
True
```
像第一個例子那樣提供關鍵字參數的方式只能使用有效的 Python 標識符作為鍵。 其他方式則可使用任何有效的鍵。
這些是字典所支持的操作(因而自定義的映射類型也應當支持):
`len(d)`返回字典 *d* 中的項數。
`d[key]`返回 *d* 中以 *key* 為鍵的項。 如果映射中不存在 *key* 則會引發 [`KeyError`](exceptions.xhtml#KeyError "KeyError")。
如果字典的子類定義了方法 [`__missing__()`](../reference/datamodel.xhtml#object.__missing__ "object.__missing__") 并且 *key* 不存在,則 `d[key]` 操作將調用該方法并附帶鍵 *key* 作為參數。 `d[key]` 隨后將返回或引發 `__missing__(key)` 調用所返回或引發的任何對象或異常。 沒有其他操作或方法會發起調用 [`__missing__()`](../reference/datamodel.xhtml#object.__missing__ "object.__missing__")。 如果未定義 [`__missing__()`](../reference/datamodel.xhtml#object.__missing__ "object.__missing__"),則會引發 [`KeyError`](exceptions.xhtml#KeyError "KeyError")。 [`__missing__()`](../reference/datamodel.xhtml#object.__missing__ "object.__missing__") 必須是一個方法;它不能是一個實例變量:
```
>>> class Counter(dict):
... def __missing__(self, key):
... return 0
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1
```
上面的例子顯示了 [`collections.Counter`](collections.xhtml#collections.Counter "collections.Counter") 實現的部分代碼。 還有另一個不同的 `__missing__` 方法是由 [`collections.defaultdict`](collections.xhtml#collections.defaultdict "collections.defaultdict") 所使用的。
`d[key] = value`將 `d[key]` 設為 *value*。
`del d[key]`將 `d[key]` 從 *d* 中移除。 如果映射中不存在 *key* 則會引發 [`KeyError`](exceptions.xhtml#KeyError "KeyError")。
`key in d`如果 *d* 中存在鍵 *key* 則返回 `True`,否則返回 `False`。
`key not in d`等價于 `not key in d`。
`iter(d)`返回以字典的鍵為元素的迭代器。 這是 `iter(d.keys())` 的快捷方式。
`clear`()移除字典中的所有元素。
`copy`()返回原字典的淺拷貝。
*classmethod* `fromkeys`(*iterable*\[, *value*\])使用來自 *iterable* 的鍵創建一個新字典,并將鍵值設為 *value*。
[`fromkeys()`](#dict.fromkeys "dict.fromkeys") 屬于類方法,會返回一個新字典。 *value* 默認為 `None`。
`get`(*key*\[, *default*\])如果 *key* 存在于字典中則返回 *key* 的值,否則返回 *default*。 如果 *default* 未給出則默認為 `None`,因而此方法絕不會引發 [`KeyError`](exceptions.xhtml#KeyError "KeyError")。
`items`()返回由字典項 (`(鍵, 值)` 對) 組成的一個新視圖。 參見 [視圖對象文檔](#dict-views)。
`keys`()返回由字典鍵組成的一個新視圖。 參見 [視圖對象文檔](#dict-views)。
`pop`(*key*\[, *default*\])如果 *key* 存在于字典中則將其移除并返回其值,否則返回 *default*。 如果 *default* 未給出且 *key* 不存在于字典中,則會引發 [`KeyError`](exceptions.xhtml#KeyError "KeyError")。
`popitem`()從字典中移除并返回一個 `(鍵, 值)` 對。 鍵值對會按 LIFO 的順序被返回。
[`popitem()`](#dict.popitem "dict.popitem") 適用于對字典進行消耗性的迭代,這在集合算法中經常被使用。 如果字典為空,調用 [`popitem()`](#dict.popitem "dict.popitem") 將引發 [`KeyError`](exceptions.xhtml#KeyError "KeyError")。
在 3.7 版更改: 現在會確保采用 LIFO 順序。 在之前的版本中,[`popitem()`](#dict.popitem "dict.popitem") 會返回一個任意的鍵/值對。
`setdefault`(*key*\[, *default*\])如果字典存在鍵 *key* ,返回它的值。如果不存在,插入值為 *default* 的鍵 *key* ,并返回 *default* 。 *default* 默認為 `None`。
`update`(\[*other*\])使用來自 *other* 的鍵/值對更新字典,覆蓋原有的鍵。 返回 `None`。
[`update()`](#dict.update "dict.update") 接受另一個字典對象,或者一個包含鍵/值對(以長度為二的元組或其他可迭代對象表示)的可迭代對象。 如果給出了關鍵字參數,則會以其所指定的鍵/值對更新字典: `d.update(red=1, blue=2)`。
`values`()返回由字典值組成的一個新視圖。 參見 [視圖對象文檔](#dict-views)。
兩個字典的比較當且僅當具有相同的 `(鍵, 值)` 對時才會相等。 順序比較 ('<', '<=', '>=', '>') 會引發 [`TypeError`](exceptions.xhtml#TypeError "TypeError")。
字典會保留插入時的順序。 請注意對鍵的更新不會影響順序。 刪除并再次添加的鍵將被插入到末尾。
```
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4}
>>> d
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> list(d)
['one', 'two', 'three', 'four']
>>> list(d.values())
[1, 2, 3, 4]
>>> d["one"] = 42
>>> d
{'one': 42, 'two': 2, 'three': 3, 'four': 4}
>>> del d["two"]
>>> d["two"] = None
>>> d
{'one': 42, 'three': 3, 'four': 4, 'two': None}
```
在 3.7 版更改: 字典順序會確保為插入順序。 此行為是自 3.6 版開始的 CPython 實現細節。
參見
[`types.MappingProxyType`](types.xhtml#types.MappingProxyType "types.MappingProxyType") 可被用來創建一個 [`dict`](#dict "dict") 的只讀視圖。
### 字典視圖對象
由 [`dict.keys()`](#dict.keys "dict.keys"), [`dict.values()`](#dict.values "dict.values") 和 [`dict.items()`](#dict.items "dict.items") 所返回的對象是 *視圖對象*。 該對象提供字典條目的一個動態視圖,這意味著當字典改變時,視圖也會相應改變。
字典視圖可以被迭代以產生與其對應的數據,并支持成員檢測:
`len(dictview)`返回字典中的條目數。
`iter(dictview)`返回字典中的鍵、值或項(以 `(鍵, 值)` 為元素的元組表示)的迭代器。
鍵和值是按插入時的順序進行迭代的。 這樣就允許使用 [`zip()`](functions.xhtml#zip "zip") 來創建 `(值, 鍵)` 對: `pairs = zip(d.values(), d.keys())`。 另一個創建相同列表的方式是 `pairs = [(v, k) for (k, v) in d.items()]`.
在添加或刪除字典中的條目期間對視圖進行迭代可能引發 [`RuntimeError`](exceptions.xhtml#RuntimeError "RuntimeError") 或者無法完全迭代所有條目。
在 3.7 版更改: 字典順序會確保為插入順序。
`x in dictview`如果 *x* 是對應字典中存在的鍵、值或項(在最后一種情況下 *x* 應為一個 `(鍵, 值)` 元組) 則返回 `True`。
鍵視圖類似于集合,因為其條目不重復且可哈希。 如果所有值都是可哈希的,即 `(鍵, 值)` 對也是不重復且可哈希的,那么條目視圖也會類似于集合。 (值視圖則不被視為類似于集合,因其條目通常都是有重復的。) 對于類似于集合的視圖,為抽象基類 [`collections.abc.Set`](collections.abc.xhtml#collections.abc.Set "collections.abc.Set") 所定義的全部操作都是有效的 (例如 `==`, `<` 或 `^`)。
一個使用字典視圖的示例:
```
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # iteration
>>> n = 0
>>> for val in values:
... n += val
>>> print(n)
504
>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']
>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'}
{'juice', 'sausage', 'bacon', 'spam'}
```
## 上下文管理器類型
Python 的 [`with`](../reference/compound_stmts.xhtml#with) 語句支持通過上下文管理器所定義的運行時上下文這一概念。 此對象的實現使用了一對專門方法,允許用戶自定義類來定義運行時上下文,在語句體被執行前進入該上下文,并在語句執行完畢時退出該上下文:
`contextmanager.``__enter__`()進入運行時上下文并返回此對象或關聯到該運行時上下文的其他對象。 此方法的返回值會綁定到使用此上下文管理器的 [`with`](../reference/compound_stmts.xhtml#with) 語句的 `as` 子句中的標識符。
一個返回其自身的上下文管理器的例子是 [file object](../glossary.xhtml#term-file-object)。 文件對象會從 \_\_enter\_\_() 返回其自身,以允許 [`open()`](functions.xhtml#open "open") 被用作 [`with`](../reference/compound_stmts.xhtml#with) 語句中的上下文表達式。
一個返回關聯對象的上下文管理器的例子是 [`decimal.localcontext()`](decimal.xhtml#decimal.localcontext "decimal.localcontext") 所返回的對象。 此種管理器會將活動的 decimal 上下文設為原始 decimal 上下文的一個副本并返回該副本。 這允許對 [`with`](../reference/compound_stmts.xhtml#with) 語句的語句體中的當前 decimal 上下文進行更改,而不會影響 `with` 語句以外的代碼。
`contextmanager.``__exit__`(*exc\_type*, *exc\_val*, *exc\_tb*)退出運行時上下文并返回一個布爾值旗標來表明所發生的任何異常是否應當被屏蔽。 如果在執行 [`with`](../reference/compound_stmts.xhtml#with) 語句的語句體期間發生了異常,則參數會包含異常的類型、值以及回溯信息。 在其他情況下三個參數均為 `None`。
自此方法返回一個真值將導致 [`with`](../reference/compound_stmts.xhtml#with) 語句屏蔽異常并繼續執行緊隨在 `with` 語句之后的語句。 否則異常將在此方法結束執行后繼續傳播。 在此方法執行期間發生的異常將會取代 `with` 語句的語句體中發生的任何異常。
傳入的異常絕對不應當被顯式地重新引發 —— 相反地,此方法應當返回一個假值以表明方法已成功完成并且不希望屏蔽被引發的異常。 這允許上下文管理代碼方便地檢測 [`__exit__()`](#contextmanager.__exit__ "contextmanager.__exit__") 方法是否確實已失敗。
Python 定義了一些上下文管理器來支持簡易的線程同步、文件或其他對象的快速關閉,以及更方便地操作活動的十進制算術上下文。 除了實現上下文管理協議以外,不同類型不會被特殊處理。 請參閱 [`contextlib`](contextlib.xhtml#module-contextlib "contextlib: Utilities for with-statement contexts.") 模塊查看相關的示例。
Python 的 [generator](../glossary.xhtml#term-generator) 和 [`contextlib.contextmanager`](contextlib.xhtml#contextlib.contextmanager "contextlib.contextmanager") 裝飾器提供了實現這些協議的便捷方式。 如果使用 [`contextlib.contextmanager`](contextlib.xhtml#contextlib.contextmanager "contextlib.contextmanager") 裝飾器來裝飾一個生成器函數,它將返回一個實現了必要的 [`__enter__()`](../reference/datamodel.xhtml#object.__enter__ "object.__enter__") and [`__exit__()`](../reference/datamodel.xhtml#object.__exit__ "object.__exit__") 方法的上下文管理器,而不再是由未經裝飾的生成器函數所產生的迭代器。
請注意,Python/C API 中 Python 對象的類型結構中并沒有針對這些方法的專門槽位。 想要定義這些方法的擴展類型必須將它們作為普通的 Python 可訪問方法來提供。 與設置運行時上下文的開銷相比,單個類字典查找的開銷可以忽略不計。
## 其他內置類型
解釋器支持一些其他種類的對象。 這些對象大都僅支持一兩種操作。
### 模塊
模塊唯一的特殊操作是屬性訪問: `m.name`,這里 *m* 為一個模塊而 *name* 訪問定義在 *m* 的符號表中的一個名稱。 模塊屬性可以被賦值。 (請注意 [`import`](../reference/simple_stmts.xhtml#import) 語句嚴格來說也是對模塊對象的一種操作;`import foo` 不要求存在一個名為 *foo* 的模塊對象,而是要求存在一個對于名為 *foo* 的模塊的 (永久性) *定義*。)
每個模塊都有一個特殊屬性 [`__dict__`](#object.__dict__ "object.__dict__")。 這是包含模塊的符號表的字典。 修改此字典將實際改變模塊的符號表,但是無法直接對 [`__dict__`](#object.__dict__ "object.__dict__") 賦值 (你可以寫 `m.__dict__['a'] = 1`,這會將 `m.a` 定義為 `1`,但是你不能寫 `m.__dict__ = {}`)。 不建議直接修改 [`__dict__`](#object.__dict__ "object.__dict__")。
內置于解釋器中的模塊會寫成這樣: `<module 'sys' (built-in)>`。 如果是從一個文件加載,則會寫成 `<module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>`。
### 類與類實例
關于這些類型請參閱 [對象、值與類型](../reference/datamodel.xhtml#objects) 和 [類定義](../reference/compound_stmts.xhtml#class)。
### 函數
函數對象是通過函數定義創建的。 對函數對象的唯一操作是調用它: `func(argument-list)`。
實際上存在兩種不同的函數對象:內置函數和用戶自定義函數。 兩者支持同樣的操作(調用函數),但實現方式不同,因此對象類型也不同。
更多信息請參閱 [函數定義](../reference/compound_stmts.xhtml#function)。
### 方法
方法是使用屬性表示法來調用的函數。 存在兩種形式:內置方法(例如列表的 `append()` 方法)和類實例方法。 內置方法由支持它們的類型來描述。
如果你通過一個實例來訪問方法(即定義在類命名空間內的函數),你會得到一個特殊對象: *綁定方法* (或稱 *實例方法*) 對象。 當被調用時,它會將 `self` 參數添加到參數列表。 綁定方法具有兩個特殊的只讀屬性: `m.__self__` 操作該方法的對象,而 `m.__func__` 是實現該方法的函數。 調用 `m(arg-1, arg-2, ..., arg-n)` 完全等價于調用 `m.__func__(m.__self__, arg-1, arg-2, ..., arg-n)`。
與函數對象類似,綁定方法對象也支持獲取任意屬性。 但是,由于方法屬性實際上保存于下層的函數對象中 (`meth.__func__`),因此不允許設置綁定方法的方法屬性。 嘗試設置方法的屬性將會導致引發 [`AttributeError`](exceptions.xhtml#AttributeError "AttributeError")。 想要設置方法屬性,你必須在下層的函數對象中顯式地對其進行設置:
```
>>> class C:
... def method(self):
... pass
...
>>> c = C()
>>> c.method.whoami = 'my name is method' # can't set on the method
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'method' object has no attribute 'whoami'
>>> c.method.__func__.whoami = 'my name is method'
>>> c.method.whoami
'my name is method'
```
更多信息請參閱 [標準類型層級結構](../reference/datamodel.xhtml#types)。
### 代碼對象
代碼對象被具體實現用來表示“偽編譯”的可執行 Python 代碼,例如一個函數體。 它們不同于函數對象,因為它們不包含對其全局執行環境的引用。 代碼對象由內置的 [`compile()`](functions.xhtml#compile "compile") 函數返回,并可通過從函數對象的 `__code__` 屬性從中提取。 另請參閱 [`code`](code.xhtml#module-code "code: Facilities to implement read-eval-print loops.") 模塊。
可以通過將代碼對象(而非源碼字符串)傳給 [`exec()`](functions.xhtml#exec "exec") 或 [`eval()`](functions.xhtml#eval "eval") 內置函數來執行或求值。
更多信息請參閱 [標準類型層級結構](../reference/datamodel.xhtml#types)。
### 類型對象
類型對象表示各種對象類型。 對象的類型可通過內置函數 [`type()`](functions.xhtml#type "type") 來獲取。 類型沒有特殊的操作。 標準庫模塊 [`types`](types.xhtml#module-types "types: Names for built-in types.") 定義了所有標準內置類型的名稱。
類型以這樣的寫法來表示: `<class 'int'>`。
### 空對象
此對象會由不顯式地返回值的函數所返回。 它不支持任何特殊的操作。 空對象只有一種值 `None` (這是個內置名稱)。 `type(None)()` 會生成同一個單例。
該對象的寫法為 `None`。
### 省略符對象
此對象常被用于切片 (參見 [切片](../reference/expressions.xhtml#slicings))。 它不支持任何特殊的操作。 省略符對象只有一種值 [`Ellipsis`](constants.xhtml#Ellipsis "Ellipsis") (這是個內置名稱)。 `type(Ellipsis)()` 會生成 [`Ellipsis`](constants.xhtml#Ellipsis "Ellipsis") 單例。
該對象的寫法為 `Ellipsis` 或 `...`。
### 未實現對象
此對象會被作為比較和二元運算被應用于它們所不支持的類型時的返回值。 請參閱 [比較運算](../reference/expressions.xhtml#comparisons) 了解更多信息。 未實現對象只有一種值 `NotImplemented`。 `type(NotImplemented)()` 會生成這個單例。
該對象的寫法為 `NotImplemented`。
### 布爾值
布爾值是兩個常量對象 `False` 和 `True`。 它們被用來表示邏輯上的真假(不過其他值也可被當作真值或假值)。 在數字類的上下文中(例如被用作算術運算符的參數時),它們的行為分別類似于整數 0 和 1。 內置函數 [`bool()`](functions.xhtml#bool "bool") 可被用來將任意值轉換為布爾值,只要該值可被解析為一個邏輯值(參見之前的 [邏輯值檢測](#truth) 部分)。
該對象的寫法分別為 `False` 和 `True`。
### 內部對象
有關此對象的信息請參閱 [標準類型層級結構](../reference/datamodel.xhtml#types)。 其中描述了棧幀對象、回溯對象以及切片對象等等。
## 特殊屬性
語言實現為部分對象類型添加了一些特殊的只讀屬性,它們具有各自的作用。 其中一些并不會被 [`dir()`](functions.xhtml#dir "dir") 內置函數所列出。
`object.``__dict__`一個字典或其他類型的映射對象,用于存儲對象的(可寫)屬性。
`instance.``__class__`類實例所屬的類。
`class.``__bases__`由類對象的基類所組成的元組。
`definition.``__name__`類、函數、方法、描述器或生成器實例的名稱。
`definition.``__qualname__`類、函數、方法、描述器或生成器實例的 [qualified name](../glossary.xhtml#term-qualified-name)。
3\.3 新版功能.
`class.``__mro__`此屬性是由類組成的元組,在方法解析期間會基于它來查找基類。
`class.``mro`()此方法可被一個元類來重載,以為其實例定制方法解析順序。 它會在類實例化時被調用,其結果存儲于 [`__mro__`](#class.__mro__ "class.__mro__") 之中。
`class.``__subclasses__`()每個類會保存由對其直接子類的弱引用組成的列表。 此方法將返回一個由仍然存在的所有此類引用組成的列表。 例如:
```
>>> int.__subclasses__()
[<class 'bool'>]
```
腳注
[1](#id1)有關這些特殊方法的額外信息可參看 Python 參考指南 ([基本定制](../reference/datamodel.xhtml#customization))。
[2](#id2)作為結果,列表 `[1, 2]` 與 `[1.0, 2.0]` 是相等的,元組的情況也類似。
[3](#id4)它們必須如此,因為解析器無法區分這些操作數的類型。
4([1](#id6),[2](#id7),[3](#id8),[4](#id9))區分大小寫的字符是指所屬一般類別屬性為 "Lu" (Letter, uppercase), "Ll" (Letter, lowercase) 或 "Lt" (Letter, titlecase) 之一的字符。
5([1](#id10),[2](#id11))要格式化單獨一個元組,那么你應當提供一個單例元組,其唯一的元素就是要被格式化的元組。
### 導航
- [索引](../genindex.xhtml "總目錄")
- [模塊](../py-modindex.xhtml "Python 模塊索引") |
- [下一頁](exceptions.xhtml "內置異常") |
- [上一頁](constants.xhtml "內置常量") |
- 
- [Python](https://www.python.org/) ?
- zh\_CN 3.7.3 [文檔](../index.xhtml) ?
- [Python 標準庫](index.xhtml) ?
- $('.inline-search').show(0); |
? [版權所有](../copyright.xhtml) 2001-2019, Python Software Foundation.
Python 軟件基金會是一個非盈利組織。 [請捐助。](https://www.python.org/psf/donations/)
最后更新于 5月 21, 2019. [發現了問題](../bugs.xhtml)?
使用[Sphinx](http://sphinx.pocoo.org/)1.8.4 創建。
- Python文檔內容
- Python 有什么新變化?
- Python 3.7 有什么新變化
- 摘要 - 發布重點
- 新的特性
- 其他語言特性修改
- 新增模塊
- 改進的模塊
- C API 的改變
- 構建的改變
- 性能優化
- 其他 CPython 實現的改變
- 已棄用的 Python 行為
- 已棄用的 Python 模塊、函數和方法
- 已棄用的 C API 函數和類型
- 平臺支持的移除
- API 與特性的移除
- 移除的模塊
- Windows 專屬的改變
- 移植到 Python 3.7
- Python 3.7.1 中的重要變化
- Python 3.7.2 中的重要變化
- Python 3.6 有什么新變化A
- 摘要 - 發布重點
- 新的特性
- 其他語言特性修改
- 新增模塊
- 改進的模塊
- 性能優化
- Build and C API Changes
- 其他改進
- 棄用
- 移除
- 移植到Python 3.6
- Python 3.6.2 中的重要變化
- Python 3.6.4 中的重要變化
- Python 3.6.5 中的重要變化
- Python 3.6.7 中的重要變化
- Python 3.5 有什么新變化
- 摘要 - 發布重點
- 新的特性
- 其他語言特性修改
- 新增模塊
- 改進的模塊
- Other module-level changes
- 性能優化
- Build and C API Changes
- 棄用
- 移除
- Porting to Python 3.5
- Notable changes in Python 3.5.4
- What's New In Python 3.4
- 摘要 - 發布重點
- 新的特性
- 新增模塊
- 改進的模塊
- CPython Implementation Changes
- 棄用
- 移除
- Porting to Python 3.4
- Changed in 3.4.3
- What's New In Python 3.3
- 摘要 - 發布重點
- PEP 405: Virtual Environments
- PEP 420: Implicit Namespace Packages
- PEP 3118: New memoryview implementation and buffer protocol documentation
- PEP 393: Flexible String Representation
- PEP 397: Python Launcher for Windows
- PEP 3151: Reworking the OS and IO exception hierarchy
- PEP 380: Syntax for Delegating to a Subgenerator
- PEP 409: Suppressing exception context
- PEP 414: Explicit Unicode literals
- PEP 3155: Qualified name for classes and functions
- PEP 412: Key-Sharing Dictionary
- PEP 362: Function Signature Object
- PEP 421: Adding sys.implementation
- Using importlib as the Implementation of Import
- 其他語言特性修改
- A Finer-Grained Import Lock
- Builtin functions and types
- 新增模塊
- 改進的模塊
- 性能優化
- Build and C API Changes
- 棄用
- Porting to Python 3.3
- What's New In Python 3.2
- PEP 384: Defining a Stable ABI
- PEP 389: Argparse Command Line Parsing Module
- PEP 391: Dictionary Based Configuration for Logging
- PEP 3148: The concurrent.futures module
- PEP 3147: PYC Repository Directories
- PEP 3149: ABI Version Tagged .so Files
- PEP 3333: Python Web Server Gateway Interface v1.0.1
- 其他語言特性修改
- New, Improved, and Deprecated Modules
- 多線程
- 性能優化
- Unicode
- Codecs
- 文檔
- IDLE
- Code Repository
- Build and C API Changes
- Porting to Python 3.2
- What's New In Python 3.1
- PEP 372: Ordered Dictionaries
- PEP 378: Format Specifier for Thousands Separator
- 其他語言特性修改
- New, Improved, and Deprecated Modules
- 性能優化
- IDLE
- Build and C API Changes
- Porting to Python 3.1
- What's New In Python 3.0
- Common Stumbling Blocks
- Overview Of Syntax Changes
- Changes Already Present In Python 2.6
- Library Changes
- PEP 3101: A New Approach To String Formatting
- Changes To Exceptions
- Miscellaneous Other Changes
- Build and C API Changes
- 性能
- Porting To Python 3.0
- What's New in Python 2.7
- The Future for Python 2.x
- Changes to the Handling of Deprecation Warnings
- Python 3.1 Features
- PEP 372: Adding an Ordered Dictionary to collections
- PEP 378: Format Specifier for Thousands Separator
- PEP 389: The argparse Module for Parsing Command Lines
- PEP 391: Dictionary-Based Configuration For Logging
- PEP 3106: Dictionary Views
- PEP 3137: The memoryview Object
- 其他語言特性修改
- New and Improved Modules
- Build and C API Changes
- Other Changes and Fixes
- Porting to Python 2.7
- New Features Added to Python 2.7 Maintenance Releases
- Acknowledgements
- Python 2.6 有什么新變化
- Python 3.0
- Changes to the Development Process
- PEP 343: The 'with' statement
- PEP 366: Explicit Relative Imports From a Main Module
- PEP 370: Per-user site-packages Directory
- PEP 371: The multiprocessing Package
- PEP 3101: Advanced String Formatting
- PEP 3105: print As a Function
- PEP 3110: Exception-Handling Changes
- PEP 3112: Byte Literals
- PEP 3116: New I/O Library
- PEP 3118: Revised Buffer Protocol
- PEP 3119: Abstract Base Classes
- PEP 3127: Integer Literal Support and Syntax
- PEP 3129: Class Decorators
- PEP 3141: A Type Hierarchy for Numbers
- 其他語言特性修改
- New and Improved Modules
- Deprecations and Removals
- Build and C API Changes
- Porting to Python 2.6
- Acknowledgements
- What's New in Python 2.5
- PEP 308: Conditional Expressions
- PEP 309: Partial Function Application
- PEP 314: Metadata for Python Software Packages v1.1
- PEP 328: Absolute and Relative Imports
- PEP 338: Executing Modules as Scripts
- PEP 341: Unified try/except/finally
- PEP 342: New Generator Features
- PEP 343: The 'with' statement
- PEP 352: Exceptions as New-Style Classes
- PEP 353: Using ssize_t as the index type
- PEP 357: The 'index' method
- 其他語言特性修改
- New, Improved, and Removed Modules
- Build and C API Changes
- Porting to Python 2.5
- Acknowledgements
- What's New in Python 2.4
- PEP 218: Built-In Set Objects
- PEP 237: Unifying Long Integers and Integers
- PEP 289: Generator Expressions
- PEP 292: Simpler String Substitutions
- PEP 318: Decorators for Functions and Methods
- PEP 322: Reverse Iteration
- PEP 324: New subprocess Module
- PEP 327: Decimal Data Type
- PEP 328: Multi-line Imports
- PEP 331: Locale-Independent Float/String Conversions
- 其他語言特性修改
- New, Improved, and Deprecated Modules
- Build and C API Changes
- Porting to Python 2.4
- Acknowledgements
- What's New in Python 2.3
- PEP 218: A Standard Set Datatype
- PEP 255: Simple Generators
- PEP 263: Source Code Encodings
- PEP 273: Importing Modules from ZIP Archives
- PEP 277: Unicode file name support for Windows NT
- PEP 278: Universal Newline Support
- PEP 279: enumerate()
- PEP 282: The logging Package
- PEP 285: A Boolean Type
- PEP 293: Codec Error Handling Callbacks
- PEP 301: Package Index and Metadata for Distutils
- PEP 302: New Import Hooks
- PEP 305: Comma-separated Files
- PEP 307: Pickle Enhancements
- Extended Slices
- 其他語言特性修改
- New, Improved, and Deprecated Modules
- Pymalloc: A Specialized Object Allocator
- Build and C API Changes
- Other Changes and Fixes
- Porting to Python 2.3
- Acknowledgements
- What's New in Python 2.2
- 概述
- PEPs 252 and 253: Type and Class Changes
- PEP 234: Iterators
- PEP 255: Simple Generators
- PEP 237: Unifying Long Integers and Integers
- PEP 238: Changing the Division Operator
- Unicode Changes
- PEP 227: Nested Scopes
- New and Improved Modules
- Interpreter Changes and Fixes
- Other Changes and Fixes
- Acknowledgements
- What's New in Python 2.1
- 概述
- PEP 227: Nested Scopes
- PEP 236: future Directives
- PEP 207: Rich Comparisons
- PEP 230: Warning Framework
- PEP 229: New Build System
- PEP 205: Weak References
- PEP 232: Function Attributes
- PEP 235: Importing Modules on Case-Insensitive Platforms
- PEP 217: Interactive Display Hook
- PEP 208: New Coercion Model
- PEP 241: Metadata in Python Packages
- New and Improved Modules
- Other Changes and Fixes
- Acknowledgements
- What's New in Python 2.0
- 概述
- What About Python 1.6?
- New Development Process
- Unicode
- 列表推導式
- Augmented Assignment
- 字符串的方法
- Garbage Collection of Cycles
- Other Core Changes
- Porting to 2.0
- Extending/Embedding Changes
- Distutils: Making Modules Easy to Install
- XML Modules
- Module changes
- New modules
- IDLE Improvements
- Deleted and Deprecated Modules
- Acknowledgements
- 更新日志
- Python 下一版
- Python 3.7.3 最終版
- Python 3.7.3 發布候選版 1
- Python 3.7.2 最終版
- Python 3.7.2 發布候選版 1
- Python 3.7.1 最終版
- Python 3.7.1 RC 2版本
- Python 3.7.1 發布候選版 1
- Python 3.7.0 正式版
- Python 3.7.0 release candidate 1
- Python 3.7.0 beta 5
- Python 3.7.0 beta 4
- Python 3.7.0 beta 3
- Python 3.7.0 beta 2
- Python 3.7.0 beta 1
- Python 3.7.0 alpha 4
- Python 3.7.0 alpha 3
- Python 3.7.0 alpha 2
- Python 3.7.0 alpha 1
- Python 3.6.6 final
- Python 3.6.6 RC 1
- Python 3.6.5 final
- Python 3.6.5 release candidate 1
- Python 3.6.4 final
- Python 3.6.4 release candidate 1
- Python 3.6.3 final
- Python 3.6.3 release candidate 1
- Python 3.6.2 final
- Python 3.6.2 release candidate 2
- Python 3.6.2 release candidate 1
- Python 3.6.1 final
- Python 3.6.1 release candidate 1
- Python 3.6.0 final
- Python 3.6.0 release candidate 2
- Python 3.6.0 release candidate 1
- Python 3.6.0 beta 4
- Python 3.6.0 beta 3
- Python 3.6.0 beta 2
- Python 3.6.0 beta 1
- Python 3.6.0 alpha 4
- Python 3.6.0 alpha 3
- Python 3.6.0 alpha 2
- Python 3.6.0 alpha 1
- Python 3.5.5 final
- Python 3.5.5 release candidate 1
- Python 3.5.4 final
- Python 3.5.4 release candidate 1
- Python 3.5.3 final
- Python 3.5.3 release candidate 1
- Python 3.5.2 final
- Python 3.5.2 release candidate 1
- Python 3.5.1 final
- Python 3.5.1 release candidate 1
- Python 3.5.0 final
- Python 3.5.0 release candidate 4
- Python 3.5.0 release candidate 3
- Python 3.5.0 release candidate 2
- Python 3.5.0 release candidate 1
- Python 3.5.0 beta 4
- Python 3.5.0 beta 3
- Python 3.5.0 beta 2
- Python 3.5.0 beta 1
- Python 3.5.0 alpha 4
- Python 3.5.0 alpha 3
- Python 3.5.0 alpha 2
- Python 3.5.0 alpha 1
- Python 教程
- 課前甜點
- 使用 Python 解釋器
- 調用解釋器
- 解釋器的運行環境
- Python 的非正式介紹
- Python 作為計算器使用
- 走向編程的第一步
- 其他流程控制工具
- if 語句
- for 語句
- range() 函數
- break 和 continue 語句,以及循環中的 else 子句
- pass 語句
- 定義函數
- 函數定義的更多形式
- 小插曲:編碼風格
- 數據結構
- 列表的更多特性
- del 語句
- 元組和序列
- 集合
- 字典
- 循環的技巧
- 深入條件控制
- 序列和其它類型的比較
- 模塊
- 有關模塊的更多信息
- 標準模塊
- dir() 函數
- 包
- 輸入輸出
- 更漂亮的輸出格式
- 讀寫文件
- 錯誤和異常
- 語法錯誤
- 異常
- 處理異常
- 拋出異常
- 用戶自定義異常
- 定義清理操作
- 預定義的清理操作
- 類
- 名稱和對象
- Python 作用域和命名空間
- 初探類
- 補充說明
- 繼承
- 私有變量
- 雜項說明
- 迭代器
- 生成器
- 生成器表達式
- 標準庫簡介
- 操作系統接口
- 文件通配符
- 命令行參數
- 錯誤輸出重定向和程序終止
- 字符串模式匹配
- 數學
- 互聯網訪問
- 日期和時間
- 數據壓縮
- 性能測量
- 質量控制
- 自帶電池
- 標準庫簡介 —— 第二部分
- 格式化輸出
- 模板
- 使用二進制數據記錄格式
- 多線程
- 日志
- 弱引用
- 用于操作列表的工具
- 十進制浮點運算
- 虛擬環境和包
- 概述
- 創建虛擬環境
- 使用pip管理包
- 接下來?
- 交互式編輯和編輯歷史
- Tab 補全和編輯歷史
- 默認交互式解釋器的替代品
- 浮點算術:爭議和限制
- 表示性錯誤
- 附錄
- 交互模式
- 安裝和使用 Python
- 命令行與環境
- 命令行
- 環境變量
- 在Unix平臺中使用Python
- 獲取最新版本的Python
- 構建Python
- 與Python相關的路徑和文件
- 雜項
- 編輯器和集成開發環境
- 在Windows上使用 Python
- 完整安裝程序
- Microsoft Store包
- nuget.org 安裝包
- 可嵌入的包
- 替代捆綁包
- 配置Python
- 適用于Windows的Python啟動器
- 查找模塊
- 附加模塊
- 在Windows上編譯Python
- 其他平臺
- 在蘋果系統上使用 Python
- 獲取和安裝 MacPython
- IDE
- 安裝額外的 Python 包
- Mac 上的圖形界面編程
- 在 Mac 上分發 Python 應用程序
- 其他資源
- Python 語言參考
- 概述
- 其他實現
- 標注
- 詞法分析
- 行結構
- 其他形符
- 標識符和關鍵字
- 字面值
- 運算符
- 分隔符
- 數據模型
- 對象、值與類型
- 標準類型層級結構
- 特殊方法名稱
- 協程
- 執行模型
- 程序的結構
- 命名與綁定
- 異常
- 導入系統
- importlib
- 包
- 搜索
- 加載
- 基于路徑的查找器
- 替換標準導入系統
- Package Relative Imports
- 有關 main 的特殊事項
- 開放問題項
- 參考文獻
- 表達式
- 算術轉換
- 原子
- 原型
- await 表達式
- 冪運算符
- 一元算術和位運算
- 二元算術運算符
- 移位運算
- 二元位運算
- 比較運算
- 布爾運算
- 條件表達式
- lambda 表達式
- 表達式列表
- 求值順序
- 運算符優先級
- 簡單語句
- 表達式語句
- 賦值語句
- assert 語句
- pass 語句
- del 語句
- return 語句
- yield 語句
- raise 語句
- break 語句
- continue 語句
- import 語句
- global 語句
- nonlocal 語句
- 復合語句
- if 語句
- while 語句
- for 語句
- try 語句
- with 語句
- 函數定義
- 類定義
- 協程
- 最高層級組件
- 完整的 Python 程序
- 文件輸入
- 交互式輸入
- 表達式輸入
- 完整的語法規范
- Python 標準庫
- 概述
- 可用性注釋
- 內置函數
- 內置常量
- 由 site 模塊添加的常量
- 內置類型
- 邏輯值檢測
- 布爾運算 — and, or, not
- 比較
- 數字類型 — int, float, complex
- 迭代器類型
- 序列類型 — list, tuple, range
- 文本序列類型 — str
- 二進制序列類型 — bytes, bytearray, memoryview
- 集合類型 — set, frozenset
- 映射類型 — dict
- 上下文管理器類型
- 其他內置類型
- 特殊屬性
- 內置異常
- 基類
- 具體異常
- 警告
- 異常層次結構
- 文本處理服務
- string — 常見的字符串操作
- re — 正則表達式操作
- 模塊 difflib 是一個計算差異的助手
- textwrap — Text wrapping and filling
- unicodedata — Unicode 數據庫
- stringprep — Internet String Preparation
- readline — GNU readline interface
- rlcompleter — GNU readline的完成函數
- 二進制數據服務
- struct — Interpret bytes as packed binary data
- codecs — Codec registry and base classes
- 數據類型
- datetime — 基礎日期/時間數據類型
- calendar — General calendar-related functions
- collections — 容器數據類型
- collections.abc — 容器的抽象基類
- heapq — 堆隊列算法
- bisect — Array bisection algorithm
- array — Efficient arrays of numeric values
- weakref — 弱引用
- types — Dynamic type creation and names for built-in types
- copy — 淺層 (shallow) 和深層 (deep) 復制操作
- pprint — 數據美化輸出
- reprlib — Alternate repr() implementation
- enum — Support for enumerations
- 數字和數學模塊
- numbers — 數字的抽象基類
- math — 數學函數
- cmath — Mathematical functions for complex numbers
- decimal — 十進制定點和浮點運算
- fractions — 分數
- random — 生成偽隨機數
- statistics — Mathematical statistics functions
- 函數式編程模塊
- itertools — 為高效循環而創建迭代器的函數
- functools — 高階函數和可調用對象上的操作
- operator — 標準運算符替代函數
- 文件和目錄訪問
- pathlib — 面向對象的文件系統路徑
- os.path — 常見路徑操作
- fileinput — Iterate over lines from multiple input streams
- stat — Interpreting stat() results
- filecmp — File and Directory Comparisons
- tempfile — Generate temporary files and directories
- glob — Unix style pathname pattern expansion
- fnmatch — Unix filename pattern matching
- linecache — Random access to text lines
- shutil — High-level file operations
- macpath — Mac OS 9 路徑操作函數
- 數據持久化
- pickle —— Python 對象序列化
- copyreg — Register pickle support functions
- shelve — Python object persistence
- marshal — Internal Python object serialization
- dbm — Interfaces to Unix “databases”
- sqlite3 — SQLite 數據庫 DB-API 2.0 接口模塊
- 數據壓縮和存檔
- zlib — 與 gzip 兼容的壓縮
- gzip — 對 gzip 格式的支持
- bz2 — 對 bzip2 壓縮算法的支持
- lzma — 用 LZMA 算法壓縮
- zipfile — 在 ZIP 歸檔中工作
- tarfile — Read and write tar archive files
- 文件格式
- csv — CSV 文件讀寫
- configparser — Configuration file parser
- netrc — netrc file processing
- xdrlib — Encode and decode XDR data
- plistlib — Generate and parse Mac OS X .plist files
- 加密服務
- hashlib — 安全哈希與消息摘要
- hmac — 基于密鑰的消息驗證
- secrets — Generate secure random numbers for managing secrets
- 通用操作系統服務
- os — 操作系統接口模塊
- io — 處理流的核心工具
- time — 時間的訪問和轉換
- argparse — 命令行選項、參數和子命令解析器
- getopt — C-style parser for command line options
- 模塊 logging — Python 的日志記錄工具
- logging.config — 日志記錄配置
- logging.handlers — Logging handlers
- getpass — 便攜式密碼輸入工具
- curses — 終端字符單元顯示的處理
- curses.textpad — Text input widget for curses programs
- curses.ascii — Utilities for ASCII characters
- curses.panel — A panel stack extension for curses
- platform — Access to underlying platform's identifying data
- errno — Standard errno system symbols
- ctypes — Python 的外部函數庫
- 并發執行
- threading — 基于線程的并行
- multiprocessing — 基于進程的并行
- concurrent 包
- concurrent.futures — 啟動并行任務
- subprocess — 子進程管理
- sched — 事件調度器
- queue — 一個同步的隊列類
- _thread — 底層多線程 API
- _dummy_thread — _thread 的替代模塊
- dummy_threading — 可直接替代 threading 模塊。
- contextvars — Context Variables
- Context Variables
- Manual Context Management
- asyncio support
- 網絡和進程間通信
- asyncio — 異步 I/O
- socket — 底層網絡接口
- ssl — TLS/SSL wrapper for socket objects
- select — Waiting for I/O completion
- selectors — 高級 I/O 復用庫
- asyncore — 異步socket處理器
- asynchat — 異步 socket 指令/響應 處理器
- signal — Set handlers for asynchronous events
- mmap — Memory-mapped file support
- 互聯網數據處理
- email — 電子郵件與 MIME 處理包
- json — JSON 編碼和解碼器
- mailcap — Mailcap file handling
- mailbox — Manipulate mailboxes in various formats
- mimetypes — Map filenames to MIME types
- base64 — Base16, Base32, Base64, Base85 數據編碼
- binhex — 對binhex4文件進行編碼和解碼
- binascii — 二進制和 ASCII 碼互轉
- quopri — Encode and decode MIME quoted-printable data
- uu — Encode and decode uuencode files
- 結構化標記處理工具
- html — 超文本標記語言支持
- html.parser — 簡單的 HTML 和 XHTML 解析器
- html.entities — HTML 一般實體的定義
- XML處理模塊
- xml.etree.ElementTree — The ElementTree XML API
- xml.dom — The Document Object Model API
- xml.dom.minidom — Minimal DOM implementation
- xml.dom.pulldom — Support for building partial DOM trees
- xml.sax — Support for SAX2 parsers
- xml.sax.handler — Base classes for SAX handlers
- xml.sax.saxutils — SAX Utilities
- xml.sax.xmlreader — Interface for XML parsers
- xml.parsers.expat — Fast XML parsing using Expat
- 互聯網協議和支持
- webbrowser — 方便的Web瀏覽器控制器
- cgi — Common Gateway Interface support
- cgitb — Traceback manager for CGI scripts
- wsgiref — WSGI Utilities and Reference Implementation
- urllib — URL 處理模塊
- urllib.request — 用于打開 URL 的可擴展庫
- urllib.response — Response classes used by urllib
- urllib.parse — Parse URLs into components
- urllib.error — Exception classes raised by urllib.request
- urllib.robotparser — Parser for robots.txt
- http — HTTP 模塊
- http.client — HTTP協議客戶端
- ftplib — FTP protocol client
- poplib — POP3 protocol client
- imaplib — IMAP4 protocol client
- nntplib — NNTP protocol client
- smtplib —SMTP協議客戶端
- smtpd — SMTP Server
- telnetlib — Telnet client
- uuid — UUID objects according to RFC 4122
- socketserver — A framework for network servers
- http.server — HTTP 服務器
- http.cookies — HTTP state management
- http.cookiejar — Cookie handling for HTTP clients
- xmlrpc — XMLRPC 服務端與客戶端模塊
- xmlrpc.client — XML-RPC client access
- xmlrpc.server — Basic XML-RPC servers
- ipaddress — IPv4/IPv6 manipulation library
- 多媒體服務
- audioop — Manipulate raw audio data
- aifc — Read and write AIFF and AIFC files
- sunau — 讀寫 Sun AU 文件
- wave — 讀寫WAV格式文件
- chunk — Read IFF chunked data
- colorsys — Conversions between color systems
- imghdr — 推測圖像類型
- sndhdr — 推測聲音文件的類型
- ossaudiodev — Access to OSS-compatible audio devices
- 國際化
- gettext — 多語種國際化服務
- locale — 國際化服務
- 程序框架
- turtle — 海龜繪圖
- cmd — 支持面向行的命令解釋器
- shlex — Simple lexical analysis
- Tk圖形用戶界面(GUI)
- tkinter — Tcl/Tk的Python接口
- tkinter.ttk — Tk themed widgets
- tkinter.tix — Extension widgets for Tk
- tkinter.scrolledtext — 滾動文字控件
- IDLE
- 其他圖形用戶界面(GUI)包
- 開發工具
- typing — 類型標注支持
- pydoc — Documentation generator and online help system
- doctest — Test interactive Python examples
- unittest — 單元測試框架
- unittest.mock — mock object library
- unittest.mock 上手指南
- 2to3 - 自動將 Python 2 代碼轉為 Python 3 代碼
- test — Regression tests package for Python
- test.support — Utilities for the Python test suite
- test.support.script_helper — Utilities for the Python execution tests
- 調試和分析
- bdb — Debugger framework
- faulthandler — Dump the Python traceback
- pdb — The Python Debugger
- The Python Profilers
- timeit — 測量小代碼片段的執行時間
- trace — Trace or track Python statement execution
- tracemalloc — Trace memory allocations
- 軟件打包和分發
- distutils — 構建和安裝 Python 模塊
- ensurepip — Bootstrapping the pip installer
- venv — 創建虛擬環境
- zipapp — Manage executable Python zip archives
- Python運行時服務
- sys — 系統相關的參數和函數
- sysconfig — Provide access to Python's configuration information
- builtins — 內建對象
- main — 頂層腳本環境
- warnings — Warning control
- dataclasses — 數據類
- contextlib — Utilities for with-statement contexts
- abc — 抽象基類
- atexit — 退出處理器
- traceback — Print or retrieve a stack traceback
- future — Future 語句定義
- gc — 垃圾回收器接口
- inspect — 檢查對象
- site — Site-specific configuration hook
- 自定義 Python 解釋器
- code — Interpreter base classes
- codeop — Compile Python code
- 導入模塊
- zipimport — Import modules from Zip archives
- pkgutil — Package extension utility
- modulefinder — 查找腳本使用的模塊
- runpy — Locating and executing Python modules
- importlib — The implementation of import
- Python 語言服務
- parser — Access Python parse trees
- ast — 抽象語法樹
- symtable — Access to the compiler's symbol tables
- symbol — 與 Python 解析樹一起使用的常量
- token — 與Python解析樹一起使用的常量
- keyword — 檢驗Python關鍵字
- tokenize — Tokenizer for Python source
- tabnanny — 模糊縮進檢測
- pyclbr — Python class browser support
- py_compile — Compile Python source files
- compileall — Byte-compile Python libraries
- dis — Python 字節碼反匯編器
- pickletools — Tools for pickle developers
- 雜項服務
- formatter — Generic output formatting
- Windows系統相關模塊
- msilib — Read and write Microsoft Installer files
- msvcrt — Useful routines from the MS VC++ runtime
- winreg — Windows 注冊表訪問
- winsound — Sound-playing interface for Windows
- Unix 專有服務
- posix — The most common POSIX system calls
- pwd — 用戶密碼數據庫
- spwd — The shadow password database
- grp — The group database
- crypt — Function to check Unix passwords
- termios — POSIX style tty control
- tty — 終端控制功能
- pty — Pseudo-terminal utilities
- fcntl — The fcntl and ioctl system calls
- pipes — Interface to shell pipelines
- resource — Resource usage information
- nis — Interface to Sun's NIS (Yellow Pages)
- Unix syslog 庫例程
- 被取代的模塊
- optparse — Parser for command line options
- imp — Access the import internals
- 未創建文檔的模塊
- 平臺特定模塊
- 擴展和嵌入 Python 解釋器
- 推薦的第三方工具
- 不使用第三方工具創建擴展
- 使用 C 或 C++ 擴展 Python
- 自定義擴展類型:教程
- 定義擴展類型:已分類主題
- 構建C/C++擴展
- 在Windows平臺編譯C和C++擴展
- 在更大的應用程序中嵌入 CPython 運行時
- Embedding Python in Another Application
- Python/C API 參考手冊
- 概述
- 代碼標準
- 包含文件
- 有用的宏
- 對象、類型和引用計數
- 異常
- 嵌入Python
- 調試構建
- 穩定的應用程序二進制接口
- The Very High Level Layer
- Reference Counting
- 異常處理
- Printing and clearing
- 拋出異常
- Issuing warnings
- Querying the error indicator
- Signal Handling
- Exception Classes
- Exception Objects
- Unicode Exception Objects
- Recursion Control
- 標準異常
- 標準警告類別
- 工具
- 操作系統實用程序
- 系統功能
- 過程控制
- 導入模塊
- Data marshalling support
- 語句解釋及變量編譯
- 字符串轉換與格式化
- 反射
- 編解碼器注冊與支持功能
- 抽象對象層
- Object Protocol
- 數字協議
- Sequence Protocol
- Mapping Protocol
- 迭代器協議
- 緩沖協議
- Old Buffer Protocol
- 具體的對象層
- 基本對象
- 數值對象
- 序列對象
- 容器對象
- 函數對象
- 其他對象
- Initialization, Finalization, and Threads
- 在Python初始化之前
- 全局配置變量
- Initializing and finalizing the interpreter
- Process-wide parameters
- Thread State and the Global Interpreter Lock
- Sub-interpreter support
- Asynchronous Notifications
- Profiling and Tracing
- Advanced Debugger Support
- Thread Local Storage Support
- 內存管理
- 概述
- 原始內存接口
- Memory Interface
- 對象分配器
- 默認內存分配器
- Customize Memory Allocators
- The pymalloc allocator
- tracemalloc C API
- 示例
- 對象實現支持
- 在堆中分配對象
- Common Object Structures
- Type 對象
- Number Object Structures
- Mapping Object Structures
- Sequence Object Structures
- Buffer Object Structures
- Async Object Structures
- 使對象類型支持循環垃圾回收
- API 和 ABI 版本管理
- 分發 Python 模塊
- 關鍵術語
- 開源許可與協作
- 安裝工具
- 閱讀指南
- 我該如何...?
- ...為我的項目選擇一個名字?
- ...創建和分發二進制擴展?
- 安裝 Python 模塊
- 關鍵術語
- 基本使用
- 我應如何 ...?
- ... 在 Python 3.4 之前的 Python 版本中安裝 pip ?
- ... 只為當前用戶安裝軟件包?
- ... 安裝科學計算類 Python 軟件包?
- ... 使用并行安裝的多個 Python 版本?
- 常見的安裝問題
- 在 Linux 的系統 Python 版本上安裝
- 未安裝 pip
- 安裝二進制編譯擴展
- Python 常用指引
- 將 Python 2 代碼遷移到 Python 3
- 簡要說明
- 詳情
- 將擴展模塊移植到 Python 3
- 條件編譯
- 對象API的更改
- 模塊初始化和狀態
- CObject 替換為 Capsule
- 其他選項
- Curses Programming with Python
- What is curses?
- Starting and ending a curses application
- Windows and Pads
- Displaying Text
- User Input
- For More Information
- 實現描述器
- 摘要
- 定義和簡介
- 描述器協議
- 發起調用描述符
- 描述符示例
- Properties
- 函數和方法
- Static Methods and Class Methods
- 函數式編程指引
- 概述
- 迭代器
- 生成器表達式和列表推導式
- 生成器
- 內置函數
- itertools 模塊
- The functools module
- Small functions and the lambda expression
- Revision History and Acknowledgements
- 引用文獻
- 日志 HOWTO
- 日志基礎教程
- 進階日志教程
- 日志級別
- 有用的處理程序
- 記錄日志中引發的異常
- 使用任意對象作為消息
- 優化
- 日志操作手冊
- 在多個模塊中使用日志
- 在多線程中使用日志
- 使用多個日志處理器和多種格式化
- 在多個地方記錄日志
- 日志服務器配置示例
- 處理日志處理器的阻塞
- Sending and receiving logging events across a network
- Adding contextual information to your logging output
- Logging to a single file from multiple processes
- Using file rotation
- Use of alternative formatting styles
- Customizing LogRecord
- Subclassing QueueHandler - a ZeroMQ example
- Subclassing QueueListener - a ZeroMQ example
- An example dictionary-based configuration
- Using a rotator and namer to customize log rotation processing
- A more elaborate multiprocessing example
- Inserting a BOM into messages sent to a SysLogHandler
- Implementing structured logging
- Customizing handlers with dictConfig()
- Using particular formatting styles throughout your application
- Configuring filters with dictConfig()
- Customized exception formatting
- Speaking logging messages
- Buffering logging messages and outputting them conditionally
- Formatting times using UTC (GMT) via configuration
- Using a context manager for selective logging
- 正則表達式HOWTO
- 概述
- 簡單模式
- 使用正則表達式
- 更多模式能力
- 修改字符串
- 常見問題
- 反饋
- 套接字編程指南
- 套接字
- 創建套接字
- 使用一個套接字
- 斷開連接
- 非阻塞的套接字
- 排序指南
- 基本排序
- 關鍵函數
- Operator 模塊函數
- 升序和降序
- 排序穩定性和排序復雜度
- 使用裝飾-排序-去裝飾的舊方法
- 使用 cmp 參數的舊方法
- 其它
- Unicode 指南
- Unicode 概述
- Python's Unicode Support
- Reading and Writing Unicode Data
- Acknowledgements
- 如何使用urllib包獲取網絡資源
- 概述
- Fetching URLs
- 處理異常
- info and geturl
- Openers and Handlers
- Basic Authentication
- Proxies
- Sockets and Layers
- 腳注
- Argparse 教程
- 概念
- 基礎
- 位置參數介紹
- Introducing Optional arguments
- Combining Positional and Optional arguments
- Getting a little more advanced
- Conclusion
- ipaddress模塊介紹
- 創建 Address/Network/Interface 對象
- 審查 Address/Network/Interface 對象
- Network 作為 Address 列表
- 比較
- 將IP地址與其他模塊一起使用
- 實例創建失敗時獲取更多詳細信息
- Argument Clinic How-To
- The Goals Of Argument Clinic
- Basic Concepts And Usage
- Converting Your First Function
- Advanced Topics
- 使用 DTrace 和 SystemTap 檢測CPython
- Enabling the static markers
- Static DTrace probes
- Static SystemTap markers
- Available static markers
- SystemTap Tapsets
- 示例
- Python 常見問題
- Python常見問題
- 一般信息
- 現實世界中的 Python
- 編程常見問題
- 一般問題
- 核心語言
- 數字和字符串
- 性能
- 序列(元組/列表)
- 對象
- 模塊
- 設計和歷史常見問題
- 為什么Python使用縮進來分組語句?
- 為什么簡單的算術運算得到奇怪的結果?
- 為什么浮點計算不準確?
- 為什么Python字符串是不可變的?
- 為什么必須在方法定義和調用中顯式使用“self”?
- 為什么不能在表達式中賦值?
- 為什么Python對某些功能(例如list.index())使用方法來實現,而其他功能(例如len(List))使用函數實現?
- 為什么 join()是一個字符串方法而不是列表或元組方法?
- 異常有多快?
- 為什么Python中沒有switch或case語句?
- 難道不能在解釋器中模擬線程,而非得依賴特定于操作系統的線程實現嗎?
- 為什么lambda表達式不能包含語句?
- 可以將Python編譯為機器代碼,C或其他語言嗎?
- Python如何管理內存?
- 為什么CPython不使用更傳統的垃圾回收方案?
- CPython退出時為什么不釋放所有內存?
- 為什么有單獨的元組和列表數據類型?
- 列表是如何在CPython中實現的?
- 字典是如何在CPython中實現的?
- 為什么字典key必須是不可變的?
- 為什么 list.sort() 沒有返回排序列表?
- 如何在Python中指定和實施接口規范?
- 為什么沒有goto?
- 為什么原始字符串(r-strings)不能以反斜杠結尾?
- 為什么Python沒有屬性賦值的“with”語句?
- 為什么 if/while/def/class語句需要冒號?
- 為什么Python在列表和元組的末尾允許使用逗號?
- 代碼庫和插件 FAQ
- 通用的代碼庫問題
- 通用任務
- 線程相關
- 輸入輸出
- 網絡 / Internet 編程
- 數據庫
- 數學和數字
- 擴展/嵌入常見問題
- 可以使用C語言中創建自己的函數嗎?
- 可以使用C++語言中創建自己的函數嗎?
- C很難寫,有沒有其他選擇?
- 如何從C執行任意Python語句?
- 如何從C中評估任意Python表達式?
- 如何從Python對象中提取C的值?
- 如何使用Py_BuildValue()創建任意長度的元組?
- 如何從C調用對象的方法?
- 如何捕獲PyErr_Print()(或打印到stdout / stderr的任何內容)的輸出?
- 如何從C訪問用Python編寫的模塊?
- 如何從Python接口到C ++對象?
- 我使用Setup文件添加了一個模塊,為什么make失敗了?
- 如何調試擴展?
- 我想在Linux系統上編譯一個Python模塊,但是缺少一些文件。為什么?
- 如何區分“輸入不完整”和“輸入無效”?
- 如何找到未定義的g++符號__builtin_new或__pure_virtual?
- 能否創建一個對象類,其中部分方法在C中實現,而其他方法在Python中實現(例如通過繼承)?
- Python在Windows上的常見問題
- 我怎樣在Windows下運行一個Python程序?
- 我怎么讓 Python 腳本可執行?
- 為什么有時候 Python 程序會啟動緩慢?
- 我怎樣使用Python腳本制作可執行文件?
- *.pyd 文件和DLL文件相同嗎?
- 我怎樣將Python嵌入一個Windows程序?
- 如何讓編輯器不要在我的 Python 源代碼中插入 tab ?
- 如何在不阻塞的情況下檢查按鍵?
- 圖形用戶界面(GUI)常見問題
- 圖形界面常見問題
- Python 是否有平臺無關的圖形界面工具包?
- 有哪些Python的GUI工具是某個平臺專用的?
- 有關Tkinter的問題
- “為什么我的電腦上安裝了 Python ?”
- 什么是Python?
- 為什么我的電腦上安裝了 Python ?
- 我能刪除 Python 嗎?
- 術語對照表
- 文檔說明
- Python 文檔貢獻者
- 解決 Bug
- 文檔錯誤
- 使用 Python 的錯誤追蹤系統
- 開始為 Python 貢獻您的知識
- 版權
- 歷史和許可證
- 軟件歷史
- 訪問Python或以其他方式使用Python的條款和條件
- Python 3.7.3 的 PSF 許可協議
- Python 2.0 的 BeOpen.com 許可協議
- Python 1.6.1 的 CNRI 許可協議
- Python 0.9.0 至 1.2 的 CWI 許可協議
- 集成軟件的許可和認可
- Mersenne Twister
- 套接字
- Asynchronous socket services
- Cookie management
- Execution tracing
- UUencode and UUdecode functions
- XML Remote Procedure Calls
- test_epoll
- Select kqueue
- SipHash24
- strtod and dtoa
- OpenSSL
- expat
- libffi
- zlib
- cfuhash
- libmpdec