Python基礎學:內建型別(2)

zhtysw發表於2018-03-25

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

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

相關文章