迭代器用于从集合中取元素,生成器“凭空”生成元素
流畅的Python中这样定义:迭代器是实现了无参数的 'next'方法,返回序列的下一个元素,;如果没有元素了,那么抛出StopIteration异常。python迭代器还实现了,'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) # 实现实例化,并返回一个迭代器
class SentenceIteration:
def __iter__(self, words):
self.words = words # 实例引用单词列表
self.index = 0 # self.index 由于确定下一个要获取的
def __next__(self):
try:
word = self.words[self.index] # 获得self.index索引位的单词
except IndexError:
raise StopIteration() # 如果索引位没有单词,则抛出StopInteration异常
self.index += 1 # 递增
return word # 返回单词
def __iter__(self): # 实现self.__iter__方法
return self
迭代器和可迭代对象的区别
可迭代对象有一个iter方法,每次实例化一个新的迭代器,而迭代器要实现next方法,返回单个元素此外还要实现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 迭代器 设计模式 """
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
网友评论