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])
該定義已在內置函數中說明,不再贅述。