迭代器

迭代器:可迭代的对象是实现迭代器协议的对象
许多容器都是可迭代的对象列如:字符串、列表
可迭代的对象可以用for循环语句来查看元素
for i in [1,2,5,7,9]
print(i)

迭代器协议: 提供next的方法,返回迭代器中的下一项;

        如果没有下一项,则会抛出StopIteration异常,并终止迭代

python内置函数iter接收可迭代的对象并返回迭代器
迭代器指可以实现next方法的对象
迭代器.jpeg

==============================================
创建迭代器:
迭代器用内置iter()进行创建
list=[1,3,5,7,9]
list_iter=iter(list)
创建了之后进行访问用next(),如果没有下一项,则终止访问

next(list_iter)

查看某个对象是不是迭代器使用isinstance()判断对象是否为迭代器
首先导入包 从collections包里导入Iterator
from collection import Iterator
isinstance( 传入对象 ,Iterator)

python中的一些内置模块的函数可以实现高效的迭代器的创建
itertools模块内的count、cycle、islice函数
count(start,step):无限制迭代

cycle(p):无限迭代,迭代p中的成员
cycle(['a','b','c']) 就是无限循环abcabcabc

islice(seq,start,stop,step):生成有限序列

生成器

列表、元组、字典、字符串都是可迭代对象。

数字、布尔值都是不可迭代的。

Python中生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析,同时节省内存。除了创建和保持程序状态的自动生成,当发生器终结时,还会自动跑出StopIterration异常。

生成器与普通函数的区别在于它包含 yield 表达式,并且不需要定义 __iter__()和__next__()。

每调用一次next,就执行一次yield | 依靠这种需要才生产的工作机制,大大的节省资源,而普通函数是存储到一个列表当中,生成器是用一次生成一次然后情况内存,再用再调用。