迭代器用於:
直譯器需要迭代物件x時,會自動呼叫iter(x);
內建的iter函式,有以下功能:
檢查物件是否實現了 _iter _ 方法, 如果實現了就呼叫它,獲取乙個迭代器。
如果沒有實現 _iter _ 方法,但是實現了 _getitem _ 方法,python 會建立乙個迭代器,嘗試按順序(從索引 0 開始)獲取元素。
如果嘗試失敗,python丟擲typeerror異常,通常會提示"c objectis not iterable"(c 物件不可迭代),其中c是目標物件所屬的類。
__next__ #返回下乙個可用的元素,如果沒有元素了,丟擲stopiteration異常
__iter__ #返回self, 以便在應該使用可迭代物件的地方使用迭代器,例如在for迴圈中
import re
re_word = re.compile('\w+')
class sentence:
# 可迭代的物件
def __init__(self, text):
self.text = text
self.words = re_word.findall(text)
def __iter__(self): # 1
return sentenceiterator(self.words)
class sentenceiterator:
# 迭代器
def __init__(self, words):
self.words = words
self.index = 0
def __next__(self): # 2
try:
word = self.words[self.index]
except indexerror:
raise stopiteration()
self.index += 1
return word
def __iter__(self): # 3
return self
s = sentence('"the time has come," the walrus said,')
for word in s:
print(word)
--------------------
thetime
hascome
thewalrus
said
def gen_ab():
print('start')
yield 'a'
print('continue')
yield 'b'
print('end.')
print(gen_ab()) # 1
gen_ab() # 2
for item in gen_ab(): # 3
print('--->', item)
----------------
start
---> a
continue
---> b
end.
而是返回乙個生成器, 按需惰性生成元素。
def gen_ab():
print('start')
yield 'a'
print('continue')
yield 'b'
print('end.')
res1 = [x*3 for x in gen_ab()] # 1
for i in res1:
print('-->', i) # 2
res2 = (x*3 for x in gen_ab()) # 3
for i in res2:
print('--->', i)
----------------
start
continue
end.
--> aaa
--> bbb
start
---> aaa
continue
---> bbb
end.
流暢的python. Python基礎 迭代器和生成器
一 可迭代物件 在python中,我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function。這些可以直接作用於for迴圈的物件統稱為可迭...
Python基礎 迭代器和生成器
一 可迭代物件 在python中,我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function。這些可以直接作用於for迴圈的物件統稱為可迭...
Python迭代器和生成器
先說迭代器,對於string list dict tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後台for語句對容器物件呼叫iter 函式,iter 是python的內建函式。iter 會返回乙個定義了next 方法的迭代器物件,它在容器中逐個訪問容器內元素,next 也是python的...