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])

該定義已在內置函數中說明,不再贅述。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章