迭代是python最強大的功能之一,是訪問集合元素的一種方式。
迭代器是乙個可以記住遍歷的位置的物件。
迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。
迭代器有兩個基本的方法:iter()和next()。
字串,列表或元組物件都可用於建立迭代器:
>>>list=[1,2,3,4]>>> it = iter(list) #
建立迭代器物件
>>> print (next(it)) #
輸出迭代器的下乙個元素
1>>> print
(next(it))
2>>>
迭代器物件可以使用常規for語句進行遍歷:
#!/usr/bin/python3
list=[1,2,3,4]
it = iter(list) #
建立迭代器物件
for x in
it:
print (x, end="
")執行以上程式,輸出結果如下:
>>> 1234
也可以使用 next() 函式:
#!/usr/bin/python3
import sys #
引入 sys 模組
list=[1,2,3,4]
it = iter(list) #
建立迭代器物件
while
true:
try:
(next(it))
except
stopiteration:
sys.exit()
執行結果:
>>> 1 2 3 4
把乙個類作為乙個迭代器使用需要在類中實現兩個方法 __iter__() 與 __next__() 。
如果你已經了解的物件導向程式設計,就知道類都有乙個建構函式,python 的建構函式為 __init__(), 它會在物件初始化的時候執行。
__iter__() 方法返回乙個特殊的迭代器物件, 這個迭代器物件實現了 __next__() 方法並通過 stopiteration 異常標識迭代的完成。
__next__() 方法(python 2 裡是 next())會返回下乙個迭代器物件。
建立乙個返回數字的迭代器,初始值為 1,逐步遞增 1:
classmynumbers:
def__iter__
(self):
self.a = 1
return
self
def__next__
(self):
x =self.a
self.a += 1
returnx
myclass =mynumbers()
myiter =iter(myclass)
(next(myiter))
(next(myiter))
(next(myiter))
(next(myiter))
print(next(myiter))
執行輸出結果為:
>>> 1 2 3 4 5
stopiteration 異常用於標識迭代的完成,防止出現無限迴圈的情況,在 __next__() 方法中我們可以設定在完成指定迴圈次數後觸發 stopiteration 異常來結束迭代。
在 20 次迭代後停止執行:
classmynumbers:
def__iter__
(self):
self.a = 1
return
self
def__next__
(self):
if self.a <= 20:
x =self.a
self.a += 1
return
x
else
:
raise
stopiteration
myclass =mynumbers()
myiter =iter(myclass)
for x in
myiter:
(x)執行結果:
>>>1 到 20
後記:前文提到:字串,列表或元組物件都可用於建立迭代器。
字串(strings):
普通的舊字串也是可迭代的。
for s in"hello":
print(s, end= ' ')
結果為:
>>> h e l l o
列表(lists):
這些可能是最明顯的迭代。
for x in [none,3,4.5,"foo",lambda : "
moo"
,object,object()]:
print ("
()".format(x,type(x)))
輸出結果為:
none()3()4.5()foo ()()()()
元組(tuples):
元組在某些基本方面與列表不同,注意到以下示例中的可迭代物件使用圓括號而不是方括號,但輸出與上面列表示例的輸出相同。
for x in (none,3,4.5,"foo",lambda : "
moo"
,object,object()):
print ("
()".format(x,type(x)))
輸出結果為:
none (
'nonetype
'>)
3 ('
int'>)
4.5 ('
float
'>)
foo (
'str
'>)
lambda> at 0x7feec7fa7578> ('
function
'>)
'object
'> ('
type
'>)
('object
'>)
字典(dictionaries):
字典是鍵值對的無序列表。當您使用for迴圈遍歷字典時,您的虛擬變數將使用各種鍵填充。
d =for skey in
d:
"( are
".format(skey,d[skey]))
輸出結果為:
brussel sprouts are evil
cauliflower are pretty good
bananas are the best
也許不是這個順序,字典是無序的!!!
C 學習筆記(二十四)迭代器
迭代器 迭代器是自動生成可列舉型別和列舉數的結構。1.迭代器塊 迭代器塊是有乙個或多個yield語句的 塊。方法主體 訪問器主體 運算子主體都可以是迭代器塊。迭代器塊不需要同一時間內執行一串行的命令式語句,而是描述編譯器建立列舉數類的行為。yield return 語句執行了序列中返回的下一項。yi...
Python學習筆記 迭代器
from collections import iterable from collections import iterator 可迭代物件 可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 可以用isinstance 去判斷乙個物件是否是iterable物件 可以直接作用於for...
Python學習筆記 迭代器和迭代器協議
術語概念解釋 關於 for 迴圈 寫乙個迭代器 1 迭代器協議 迭代器協議是一種約定,即物件必須提供乙個 next 方法,執行該方法要麼返回迭代中的下一項,要麼丟擲乙個 stopiteration 異常,終止迭代。2 迭代器 iterator 迭代器是一種物件,一種可以被 next 函式呼叫並不斷返...