python序列可以支持迭代的原因

解释器需要迭代对象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
原文地址:https://www.cnblogs.com/liuguangshou123/p/13515772.html