Python的容器、生成器、迭代器、可迭代对象的家谱

前言


之前虽然写Python,但是对Python的这些概念也是模模糊糊,知道有一天,看到了一篇文章,讲的透彻,所以就写这篇作为对于这篇高文的读书笔记吧
致谢,该文作者,完全理解Python迭代对象、迭代器、生成器

总论


总论:可迭代对象概念最大,包含迭代器和大部分容器,以及例如files、sockets等可以迭代的对象。

容器:
    list、dequeue、set、dict、Counter、tuple、str等等,注意Bloom filter容器不能迭代,所以不是所有容器都可以迭代的。
迭代器:
    概念比较复杂,基本上就是实现了__iter__()和__next__()两个方法的对象,当没有下一个元素的时候跑出StopIteration异常。
    所以所有的生成器都是迭代器,这里的生成器包括生成器推导式,和生成器函数。
生成器:
    特殊又优雅的迭代器,函数体没有return内容(实际上,在循环中return 本身类似于break的功能,但是不能 return xxx);
    可以节省CPU和内存。
生成器表达式:
    与列表推导式的差别
    [x for x in y if x > z] -> 列表推导式
    (x for x in y if x > z) -> 生成器表达式

然后我们来重点学习一下生成器吧:

生成器


yield 来代替return 临时转移程序控制权,yield 暂时把当下的值返回给编程者,但是保留了函数运行状态,而不是像return 那样直接结束了自身函数的调用。
例如我们来处理一个大文件

def readBigFile(filename):
    with open(filename,"r") as fread:
        while True:
            try:
                line = fread.readline()
            except Exception(reason):
                raise
            if line != "" and line != None:
                yield line
            else:
                break
原文地址:https://www.cnblogs.com/KevinGeorge/p/9176991.html