迭代器用于從集合中取元素靠欢,生成器“憑空”生成元素
流暢的Python中這樣定義:迭代器是實(shí)現(xiàn)了無參數(shù)的 'next'方法捎泻,返回序列的下一個(gè)元素银亲,;如果沒有元素了盖矫,那么拋出StopIteration異常丽惭。python迭代器還實(shí)現(xiàn)了,'iter '方法辈双,因此迭代器也可以迭代责掏。
import re
import reprlib
RE_WORD = re.compile('\w+')
class Sentence:
def __init__(self, text):
self.text = text
self.words = RE_WORD.findall(text) # 返回字符串列表
def __repr__(self):
return "Sentence(%s)" % reprlib.repr(self.text)
def __iter__(self):
return SentenceIteration(self.words) # 實(shí)現(xiàn)實(shí)例化,并返回一個(gè)迭代器
class SentenceIteration:
def __iter__(self, words):
self.words = words # 實(shí)例引用單詞列表
self.index = 0 # self.index 由于確定下一個(gè)要獲取的
def __next__(self):
try:
word = self.words[self.index] # 獲得self.index索引位的單詞
except IndexError:
raise StopIteration() # 如果索引位沒有單詞湃望,則拋出StopInteration異常
self.index += 1 # 遞增
return word # 返回單詞
def __iter__(self): # 實(shí)現(xiàn)self.__iter__方法
return self
迭代器和可迭代對(duì)象的區(qū)別
可迭代對(duì)象有一個(gè)iter方法换衬,每次實(shí)例化一個(gè)新的迭代器,而迭代器要實(shí)現(xiàn)next方法证芭,返回單個(gè)元素此外還要實(shí)現(xiàn)iter方法瞳浦,返回迭代器本身。
例一
it = iter(range(4))
try:
while 1:
print(next(it))
except StopIteration:
pass
it = iter(range(4))
try:
while 1:
print(next(it))
except StopIteration:
pass
?
0
1
2
3
例二:
__doc__="""python 迭代器 設(shè)計(jì)模式 """
class Number():
def __init__(self,number):
self.number = number
def __iter__(self):
return NumberIter(self.number)
class NumberIter():
def __init__(self,number):
self.number = number
self.index = 1
def __next__(self):
value = int(self.number/self.index)%10
self.index *= 10
if value < 1 :
raise StopIteration
return value
if __name__=="__main__":
n = Number(1234)
for i in n:
print(i)
image.png