python迭代器

作者: lvyz0207 | 来源:发表于2018-05-27 22:15 被阅读36次

    迭代器用于从集合中取元素,生成器“凭空”生成元素

    流畅的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

    相关文章

      网友评论

        本文标题:python迭代器

        本文链接:https://www.haomeiwen.com/subject/hgvijftx.html