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


  • 容器是一系列元素的集合(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迭代对象、迭代器、生成器_第1张图片
容器, 可迭代对象, 迭代器, 生成器关系图

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

你可能感兴趣的:(完全理解Python迭代对象、迭代器、生成器)