Python基礎學:內建型別(2)
5.迭代器型別
Python支援對容器進行迭代的概念。他有兩種不同的實現方法,但都可以歸於使用使用者自定義的類實現迭代。接下來,將詳細解釋說明:
第一種方法需要定義容器物件以提供迭代基礎:
container. __iter__()
該方法返回一個迭代器物件,且該物件滿足一系列迭代器控制協議。如果該容器支援不同型別的迭代物件,那麼就可以提供額外的方法為這些迭代物件請求專用迭代器。此方法對應於Python / C API中Python物件的型別結構的tp_iter槽。
迭代器物件需要支援下述兩個來自於迭代器控制協議的方法:
iterator. __iter__()
返回迭代器物件本身。這個請求允許迭代器和容器使用for和in語句。
iterator. __next__()
返回迭代器內的下一個元素。如果迭代器已經見底,則丟擲StopIteration例外。
Python定義一系列迭代器物件用於支援包裹通用或專用序列型別、字典和其它更加特殊的結構。但不要擔心那些特殊結構,他們都必須遵守迭代器控制協議。一旦一個迭代器的__next__()方法丟擲了StopIteration,而且它依舊繼續被呼叫的話,操作會因為不遵守規則而炸掉。
5.1 生成器類
Python的生成器提供了一個便捷的方法完成迭代器控制。如果一個容器物件的__iter__()方法被當做生成器執行,它會自動返回一個提供__iter__()和__next__()方法的迭代器物件。
6. 序列型別——list,tuple,range
下表內的操作都支援絕大多數的序列類資料,不管該序列是否是不可變序列。collections.abc.Sequence ABC使得在自定義序列型別上正確實現這些操作而變得簡單。此表列出按升序優先順序排序的序列操作。在表中,s和t是相同型別的序列,n,i,j和k是整數,x是滿足由s施加的任何型別和值限制的任意物件。此外,in和not in操作具有和比較操作相同的優先順序,+(級聯)和*(重複)操作與和它長得特別像的數字操作擁有相同優先順序。
操作 | 結果 |
x in s | 如果x與s內的某個元素相等,就返回True,否則返回False。 |
x not in s | 如果x與s內的所有元素都不相等,就返回True,否則返回False。 |
s + t | 將s與t連線起來 |
s * n 或 n * s | 等價於將s本身相加n次 |
s[i] | s的第i個元素,從0開始算起 |
s[i:j] | s的第I個到第j個元素組合 |
s[i:j:k] | s的第i個到第j個元素中符合步長k要求的元素組合 |
len(s) | s的長度 |
min(s) | s中最小的元素 |
max(s) | s中的最大元素 |
s. index(x[, i[, j]]) | 返回s中與x相等的第一個元素的序列值,或者第i到第j個元素中第一個與x相同的元素 |
s. count(x) | s中x出現的總次數 |
相同型別的序列也支援比較操作。具體來說,元組和列表通過比較順序對應的元素確定是否相等。這意味著為了比較相等,每個元素必須相等並且兩個序列必須是相同型別並具有相同長度。
6.2 不可變序列型別
通常通過對該型別內建的has()方法操作以達到操作該型別的目的,而不是操作該型別本身。
6.3 可變序列型別
下表列出了用於可變序列型別的操作。collections.abc.MutableSequence ABC使得這些自定義序列型別的處理變得更加容易。在表中s是可變序列型別的一個例項,t是可迭代物件,x是屬性物件並且嚴格遵守c設定的型別與值的限制。
操作 | 結果 |
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中的元素值替代 |
del s[i: j: k] | 刪除s中符合[i: j: k]規律的元素 |
s. append(x) | 在序列s的末尾增添一個元素,其值為x,與s[len(s):len(s)] = [x] |
s. clear() | 將s中的所有元素清除掉 |
s.copy() | 為s建立一個與其相同的副本 |
s. extend(t) 或 s += t | 用t的內容擴充套件s |
s *= n | 將s中的內容重複n次,並賦給新的s |
s. insert(I, x) | 將x插入到s中序列數為i的地方 |
s. pop([i]) | 將s的第i個元素彈出 |
s. remove(x) | 把s中第一個與x值相同的元素刪除 |
s. reverse() | 釋放s佔用的空間 |
6.4 列表
列表是一個可變序列,通常用於儲存同類項目的集合(精確的相似程度會因應用應用而異)。
classlist([iterable])
列表的構成方式有以下幾種:
(1)使用一對方括號表示空列表,如:[]
(2)使用方括號,其中的專案用逗號分隔,如:[a],[a, b, c]
(3)使用列表理解:[x for xin iterable]
(4)使用類構造器:list()或list(iterable)
建構函式構建一個列表,其專案與iterable的元素值與元素順序相同。iterable可以是序列,也可以是支援迭代的容器或迭代器物件。如果iterbale已經是一個列表,則複製被建立並返回副本,類似於iterable [:]。 例如,list('abc')返回['a','b','c']和列表((1,2,3))返回[1,2,3]。 如果沒有給出引數,建構函式會建立一個新的空列表[]。
sort(*,key=None, reverse=False)
此方法就地對列表進行排序,對元素的升序排列。
6.5 元組
元組是不可變序列,通常用於儲存異構資料的集合。
class tuple([iterable])
元組可以由以下方法構建:
(1)使用一對圓括號表示空元組,如:()
(2)單元素元組使用尾隨逗號定義,如:a,或(a,)
(3)用逗號分隔元組元素,如:a,b, c或(a, b, c)
(4)使用內建的tuple()函式,如:tuple()或tuple(iterable)
6.6 範圍
範圍型別表示一個不可變的數字序列,通常用於在for迴圈中迴圈特定次數。其由以下類定義:
class range(stop)
class range(start, stop[, step])
該定義已在內建函式中說明,不再贅述。