.Net 配置繫結 IOptions
一、概要
在瞭解Python的資料結構時,容器(container)、可迭代物件(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推導式(list,set,dict comprehension)眾多概念參雜在一起,難免讓人一頭霧水,下面這幅圖也許能讓大家更清楚的理解他們之間的關係。
二、容器(container)
容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用 in , not in 關鍵字判斷元素是否包含在容器中。通常這類資料結構把所有的元素儲存在記憶體中(也有一些特列並不是所有的元素都放在記憶體)在Python中,常見的容器物件有:
- list
- dict
- set
- tuple
- str
儘管絕大多數容器都提供了某種方式來獲取其中的每一個元素,但這並不是容器本身提供的能力,而是可迭代物件賦予了容器這種能力,當然並不是所有的容器都是可迭代的。
三、可迭代物件(iterable)
一個list或tuple,我們可以通過for
迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration)。很多容器都是可迭代物件(比如:list、dict、tuple等),此外,像開啟的檔案,也是可迭代物件。但凡可以返回一個迭代器的物件都可成為可迭代物件。
這裡x是一個list,是一個可迭代物件。我們知道,list、dict、set、tuple、str都是可迭代物件,通過iter()或__iter__(),就可以轉化為一個迭代器。所以,我們可以說:一個具有iter方法的物件就可以稱為可迭代物件。
四、迭代器(iterator)
上圖中,y和z就是兩個獨立的迭代器,它是通過iter()方法從可迭代物件轉化而來的。它是一個帶狀態的物件,該狀態用於記錄當前迭代所在的位置,以便下次迭代的時候取到正確的元素。它能在你呼叫 next() 方法的時候返回容器中的下一個值,任何實現了 __next__() 或next()方法的物件都是迭代器。迭代器有一種具體的迭代器型別,比如 list_iterator、set_iterator、tuple_iterator、str_iterator等 。
五、for迴圈的內部實現
在大多數情況下我們都不會用next()方法去可迭代物件中去取值,而是會用:for i in (iterable),如下圖:
for迴圈內部做了3件事情:
- 呼叫iter()把可迭代物件轉換成迭代器
- 不斷的呼叫迭代器的next()方法
- 處理StopIteration異常,結束迴圈
六、isinstance
可以使用isinstance()
判斷一個物件是否是Iterator
物件,如下:
1 from collections import Iterator,Iterable 2 l = [1,2,3,4,5] 3 d = iter(l) 4 print(isinstance(l,list)) # 判斷是否是list 5 print(isinstance(l,Iterable)) # 判斷是否是可迭代物件 6 print(isinstance(l,Iterator)) # 判斷是否是迭代器 7 print(isinstance(d,Iterator)) # 判斷是否是迭代器 8 # True 9 # True 10 # False 11 # True