美文网首页
完全理解Python迭代对象、迭代器、生成器

完全理解Python迭代对象、迭代器、生成器

作者: __robin | 来源:发表于2018-08-28 10:35 被阅读0次

    • 容器是一系列元素的集合(str、list、set、dict、file、sockets对象),容器都可以被迭代(用在forwhile等语句中),因此他们被称为可迭代对象(iterable)
    • 可迭代对象(iterable)实现了__iter__方法, 该方法返回一个迭代器对象 如代码示例,或者实现了__getitem__ 方法, 而且其参数是从零开始的索引
    • 任何实现了__iter____next__方法的对象都是迭代器(iterator), __iter__返回迭代器自身, __next__返回容器中的下一个值, 如果容器中没有更多元素了,则抛出StopIteration异常,至于它们到底是如何实现的这并不重要。
    • 迭代器持有一个内部状态的字段,用于记录下次迭代返回值,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。
    • 生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写__iter__()__next__()方法了,只需要一个yiled关键字。 生成器一定是迭代器(反之不成立)。
    • 生成器有两种表现形式, 生成器函数(yiled)和生成器表达式
    import re
    from _collections_abc import Iterable, Iterator
    
    
    class Sentence:
        def __init__(self, text):
            self.text = text
            self.words = re.compile('\w+').findall(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
    
    
    print(issubclass(Sentence, Iterable))
    print(issubclass(Sentence, Iterator))
    print(issubclass(SentenceIterator, Iterator))
    
    #输出结果:
    True
    False
    True
    



    关系图如下:

    容器, 可迭代对象, 迭代器, 生成器关系图

    参考文档:容器, 可迭代对象, 迭代器, 生成器关系

    相关文章

      网友评论

          本文标题:完全理解Python迭代对象、迭代器、生成器

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