迭代器
迭代器是一个可以记住遍历的位置的对象。
有两个操作迭代器的内置函数:iter() 和 next()。
iter() ——内置函数
返回迭代器对象,语法:
iter(object[, sentinel])
参数:
object -- 可迭代对象
sentinel -- 如果传递了第二个参数,则参数 object 必须是一个可调用的对象(如,函数),此时,iter 创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用 object。
next() ——内置函数
调用迭代器对象的__next__()方法,返回下一个迭代器对象。
语法:
next(iterator[, default])
参数说明:
iterator -- 可迭代对象
default -- 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。
可迭代对象都可用于创建迭代器,迭代器对象可以使用常规for语句或者next() 函数进行遍历。
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
__iter__() 方法返回一个实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。的迭代器对象, 这个迭代器对象
__next__() 方法会返回下一个迭代器对象。
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
生成器
使用了 yield关键字的函数被称为生成器(generator)。
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
对一个生成器函数的调用,返回的是一个迭代器对象。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield的值, 并在下一次执行 next() 方法或for语句时从当前位置继续运行。