可迭代对象
刚开始我认为这两者是等同的,但后来发现并不是这样;下面直接抛出结论:
)可迭代对象包含迭代器。
)如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。
)定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。
迭代器
. 迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器
. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
. 迭代器有两个基本的方法:iter() 和 next()。
. 可使用isinstance()判断一个对象是否是迭代器对象(Iterator)
. Python3中range(n)生成的是迭代器对象; python2中xrange(n)生成的才是迭代器对象
生成器
. 在Python中使用了yield的函数称为生成器
. 什么时候使用yield: 一个函数 f,f 返回一个 list,这个 list 是动态计算出来的(不管是数学上的计算还是逻辑上的读取格式化),并且这个 list 会很大(无论是固定很大还是随着输入参数的增大而增大),这个时候,我们希望每次调用这个函数并使用迭代器进行循环的时候一个一个的得到每个 list 元素而不是直接得到一个完整的 list 来节省内存,这个时候 yield 就很有用。
. 生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。仅需要一个yield关键字。
. 任何生成器也是以一种懒加载的模式生成值。
. 生成器相比其它容器对象它更能节省内存和CPU。执行一次运算一次。
. 生成器中的元素第一之后并不实际生成。
. 在一个 generator function 中,如果没有 return,则默认执行至函数完毕,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。