解释器需要迭代对象x时,会自动调用iter(x)
1.检查对象是否实现了__iter__方法,实现了就调用它,获取一个迭代器。
2.没有实现__iter__方法,实现了__getitem__方法。Python会创建一个迭代器,按顺序获取元素。
3.都没有实现,就会抛出TypeError异常。
所有什么是可迭代对象?
Python可以从可迭代对象中获取迭代器。
比如迭代一个字符串
>>>s='ABC' >>>for char in s: print(char) A B C
使用while
s='ABC' it=iter(s)#it为一个迭代器,s为可迭代对象 while True: try: print(next(it))#在迭代器上调用next函数获取下一个元素 except StopIteration:#没有单词,迭代器抛出StopIteration异常
del it
break
两种方式实现“句子类”的迭代:
更符合python习惯的方式,生成器函数——————调用它时,会返回一个生成器对象
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):
for word in self.words:
yield word#生成全部值之后直接退出
return
Sentence实例为可迭代对象,SentenceIterrator实例为迭代器
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 SentenceIterator(self.words)#返回一个迭代器 class SentenceIterator: def __init__(self,words): self.words=words self.index=0 def __next__(self): try: word=self.words[self.index] except IndexError: raise StopIteration() self.index+=1 return word def __iter__(self): return self