前言
之前虽然写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