可迭代物件
簡單來講,乙個實際儲存的序列,或者可以通過類似for i in [1, 2, 3, 4, 5]:
類似的語法取值的物件,列表就是乙個典型的可迭代物件:
>>> my_list = [1, 2, 3, 4, 5]
>>>
for i in my_list:
... print(i)
... 12
345複製**
for
語句在此處提供了乙個迭代環境,for
語句通過跌打協議從可迭代物件中取出值。for
迴圈執行時,實際上是獲取了可迭代物件的迭代器,呼叫了迭代器的__next__
函式,來生成序列的下乙個值。當序列結束時,呼叫__next__
函式會丟擲stopiteration
異常,for
迴圈語句可以捕獲這個異常,以決定何時終止迴圈。
注意,可迭代物件是不可以直接呼叫__next__()
方法的。
迭代器>>> my_list.__next__()
traceback (most recent call last):
file "", line 1, in
attributeerror: 'list' object has no attribute '__next__'
複製**
通常,我們可以通過iter()
方法獲取可迭代物件中的迭代器,迭代器可以直接呼叫__next__()
方法:
當迭代器結束時,呼叫>>> li = iter(my_list)
>>> li.__next__()
1>>> iter_list = iter(my_list)
>>> iter_list.__next__()
1>>> iter_list.__next__()
2>>> iter_list.__next__()
3>>> iter_list.__next__()
4>>> iter_list.__next__()
5>>> iter_list.__next__()
traceback (most recent call last):
file "", line 1, in
stopiteration
複製**
__next__()
方法會丟擲stopiteration
異常。 在pyhon3中,還提供了乙個內建函式next()
,可以自動呼叫乙個物件的__next__()
方法。
>>> iter_list = iter(my_list)
>>> next(iter_list)
1>>> next(iter_list)
2>>> next(iter_list)
3>>> next(iter_list)
4>>> next(iter_list)
5>>> next(iter_list)
traceback (most recent call last):
file "", line 1, in
stopiteration
複製**
同樣地,內建next()
方法也不可以直接用於可迭代物件。
報錯顯示>>> next(my_list)
traceback (most recent call last):
file "", line 1, in
typeerror: 'list' object is
not an iterator
複製**
list
物件不是乙個迭代器。
生成器生成器提供了乙個在需要的時候才產生結果的工具,而不是立即產生結果,可以通過兩種方式來建立
def
squares
(n):
for i in range(n):
yield = i ** 2
複製**
yield
語句會掛起該函式,並向呼叫者傳送乙個值,並且儲存函式當前的執行狀態,類似於上下文,使得函式能夠在離開的地方繼續執行。 當函式包括一條yield
語句時, 會自動編譯稱為生成器,當呼叫時,會返回乙個生成器物件,該物件支援使用__next__()
方法來自動執行介面,並且在結束時丟擲stopiteration
異常
上面的語句是乙個列表解析表示式,返回乙個列表。>>> [x ** 2
for x in range(4)]
[0, 1, 4, 9]
複製**
將中括號改為小括號,這條語句就變成了乙個生成器表示式,如果想儲存並且使用該表示式,需要使用乙個變數接收。>>> (x ** 2
for x in range(4))
at 0x1030cfe60>
複製**
>>> x = (x ** 2
for x in range(4))
>>> x.__next__()
0>>> next(x)
1>>> x.__next__()
4>>> next(x)
9>>> x.__next__()
traceback (most recent call last):
file "", line 1, in
stopiteration
複製**
python中 可迭代物件
迭代是訪問集合元素的 種 式。迭代器是 個可以記住遍歷的位置的物件。迭代器物件從集合的第 個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。我們已經知道可以對list tuple str等型別的資料使 for in 的迴圈語法從 其中依次拿到資料進 使 我們把這樣的過程稱為遍歷,也...
PYTHON 迭代器 可迭代物件
通過重複執行的 處理相似的資料集的過程,並且本次迭代的處理資料要依賴上一次的結果繼續往下做,上一次產生的結果為下一次產生結果的初始狀態,如果中途有任何停頓,都不能算是迭代。1 非迭代例子 loop 0 while loop 3 print hello world loop 1 2 迭代例子 loop...
python迭代 可迭代物件與迭代器物件
問題舉例 某軟體要求,從網路抓取各個城市的氣溫資訊,並依次顯示 北京 15 22 上海 18 23 如果一次抓取所有城市氣溫資訊再顯示,顯示第乙個城市的氣溫時會由很長的延時,並且浪費儲存空間,我們期望以 用時訪問 的策略,並且把所有城市的氣溫資訊封裝 到乙個物件裡,可用for語句進行迭代。來個栗子 ...