array
--- 高效率的數值型陣列¶
這個模組定義了一個物件型別,可以簡潔的表達一個包含基本數值的陣列:字元、整數、浮點數。陣列是一個非常類似 list(串列)的序列型別,除了陣列會限制儲存的物件型別。在建立陣列時可以使用一個字元的type code 來指定儲存的資料型別。以下為有被定義的 type codes:
Type code | C Type | Python Type | 所需的最小位元組 (bytes) | 註解 |
---|---|---|---|---|
| signed char | int | 1 | |
| unsigned char | int | 1 | |
| wchar_t | Unicode character | 2 | (1) |
| Py_UCS4 | Unicode character | 4 | (2) |
| signed short | int | 2 | |
| unsigned short | int | 2 | |
| signed int | int | 2 | |
| unsigned int | int | 2 | |
| signed long | int | 4 | |
| unsigned long | int | 4 | |
| signed long long | int | 8 | |
| unsigned long long | int | 8 | |
| float | float | 4 | |
| double | float | 8 |
註解:
根據平台的不同,它有可能是 16 位元或者 32 位元。
在 3.9 版的變更:目前
array('u')
使用wchar_t
取代已棄用的Py_UNICODE
作為 C type。這個異動並沒有影響到它的作用,因為自從 Python 3.3 開始Py_UNICODE
即為wchar_t
的別名。Deprecated since version 3.3, will be removed in version 3.16:請改用
'w'
typecode。在 3.13 版被加入.
實際上數值的表示方法是被機器的架構所決定(更精準地說,被 C 的實作方法決定)。實際的大小可以透過array.itemsize
屬性存取。
這個模組定義了以下項目:
- array.typecodes¶
一個包含所有可用的 type codes 的字串。
這個模組定義了下方的型別:
- classarray.array(typecode[,initializer])¶
一個新的陣列中的元素被typecode 限制,並由選用的initializer 參數初始化,initializer 必須是一個
bytes
或bytearray
物件、一個 Unicode 字串或包含適當型別元素的可疊代物件 (iterable)。如果給定的是一個
bytes
或bytearray
物件,新的陣列初始化時會傳入frombytes()
方法;如為 Unicode 字串則會傳入fromunicode()
方法;其他情況時, 一個 initializer 的可疊代物件將被傳入extend()
方法之中來將初始項目新增至陣列。陣列支援常見的序列操作,包含索引 (indexing)、切片 (slicing)、串接 (concatenation)、相乘 (multiplication) 等。當使用切片進行賦值時,賦值的陣列必須具備相同的 type code,其他型別的數值將導致
TypeError
。陣列同時也實作了緩衝區介面,可以在任何支援bytes-like objects 的地方使用。引發稽核事件 (auditing event)
array.__new__
並附帶引數typecode
、initializer
。- typecode¶
typecode 字元被用在建立陣列時。
- itemsize¶
陣列當中的一個元素在內部需要的位元組長度。
- append(x)¶
新增一個元素x 到陣列的最尾端。
- buffer_info()¶
回傳一個 tuple
(address,length)
表示目前的記憶體位置和陣列儲存元素的緩衝區記憶體長度。緩衝區的長度單位是位元組,並可以用array.buffer_info()[1]*array.itemsize
計算得到。這偶爾會在底層操作需要記憶體位置的輸出輸入時很有用,例如ioctl()
指令。只要陣列存在且沒有使用任何更改長度的操作時,回傳的數值就有效。備註
當使用來自 C 或 C++ 程式碼(這是唯一使得這個資訊有效的途徑)的陣列物件時,更適當的做法是使用陣列物件支援的緩衝區介面。這個方法維護了向後兼容性,並應該在新的程式碼中避免。關於緩衝區介面的文件在緩衝協定 (Buffer Protocol)。
- byteswap()¶
"Byteswap" 所有陣列中的物件。這只有支援物件長度為 1、2、4 或 8 位元組的陣列,其他型別的值會導致
RuntimeError
。這在從機器讀取位元順序不同的檔案時很有用。
- count(x)¶
回傳x 在陣列中出現了幾次。
- extend(iterable)¶
從iterable 中新增元素到陣列的尾端,如果iterable 是另一個陣列,它必須有完全相同的 type code,如果不同會導致
TypeError
。如果iterable 不是一個陣列,它必須可以被疊代 (iterable) 且其中的元素必須是可以被加入陣列中的正確型別。
- frombytes(buffer)¶
從bytes-like object 中新增元素。讀取時會將其內容當作一個機器數值組成的陣列(就像從檔案中使用
fromfile()
方法讀出的資料)。在 3.2 版被加入:將
fromstring()
更名為frombytes()
,使其更加清晰易懂。
- fromfile(f,n)¶
從file objectf 讀取n 個元素(作為機器數值),接著將這些元素加入陣列的最尾端。如果只有少於n 個有效的元素會導致
EOFError
,但有效的元素仍然會被加入陣列中。
- fromlist(list)¶
從 list 中新增元素。這等價於
forxinlist:a.append(x)
,除了有型別錯誤產生時,陣列會保持原狀不會被更改。
- fromunicode(s)¶
用給定的 Unicode 字串擴展這個陣列。陣列的 type code 必須是
u
或'w'
;其他的型別會導致ValueError
被引發。使用array.frombytes(unicodestring.encode(enc))
來新增 Unicode 資料到一個其他型別的陣列。
- index(x[,start[,stop]])¶
回傳i 的最小數值,使得i 成為陣列之中第一次出現x 的索引。選擇性的引數start 及stop 則可以被用來在指定的陣列空間中搜尋x。如果x 不存在將導致
ValueError
。在 3.10 版的變更:新增選擇性的參數start 及stop。
- insert(i,x)¶
在位置i 之前插入一個元素x。負數的索引值會從陣列尾端開始數。
- pop([i])¶
移除並回傳陣列索引值i 的元素。選擇性的引數i 預設為
-1
,所以預設會刪除並回傳最後一個元素。
- remove(x)¶
從陣列中刪除第一個出現的x。
- clear()¶
從陣列中刪除所有元素。
在 3.13 版被加入.
- reverse()¶
反轉陣列中元素的順序。
- tobytes()¶
將陣列轉為另一個機器數值組成的陣列並回傳它的位元組表示(跟用
tofile()
方法寫入檔案時的位元序列相同)。在 3.2 版被加入:為了明確性,過去的
tostring()
已更名為tobytes()
。
- tofile(f)¶
將所有元素(作為機器數值)寫入file objectf。
- tolist()¶
不更改元素,將陣列轉為一般的 list。
- tounicode()¶
將陣列轉為一個 Unicode 字串。陣列的型別必須為
u
或'w'
;其他型別的陣列會引發ValueError
。請使用array.tobytes().decode(enc)
來為其他型別的陣列轉為 Unicode 字串。
陣列物件的字串表示形式為array(typecode,initializer)
。若為空陣列則參數initializer 被省略,若typecode 是'u'
或'w'
將被表示為 Unicode 字串,其他情況則被表示為由數字組成的 list。只要array
class(類別)透過fromarrayimportarray
的方式引入,便能確保該字串表示能透過eval()
轉換回一個擁有相同型別及數值的陣列。如果它包含相應的浮點值,inf
和nan
也必須被定義。範例:
array('l')array('w','hello\u2641')array('l',[1,2,3,4,5])array('d',[1.0,2.0,3.14,-inf,nan])