python的迭代器和生成器

迭代器:

迭代是访问集合元素的一种方式
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会后退

可迭代对象:
我们已经知道可以对list,tuple,str等类型的数据使用for..in..的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。
可以被for循环遍历的对象称之为可迭代对象

from collections import Iterable
print(isinstance([1,2],Iterable))
返回True 说明[1,2]是可迭代对象,可以用for循环遍历

from collections import Iterator
print(isinstance([],Iterator)) #False
print(isinstance(iter([]),Iterator)) #Ture
Iterator是用来判断是否为迭代器
iter()可以将可迭代对象变为迭代器 然后可以用next()一个一个输出

一个具备了_iter_方法的对象,就是一个可迭代对象

_init_属性的初始化及赋值

Docker容器这本书

iter()函数与next()函数
list,tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器,然后我们可以对获取到的迭代器不断使用next()函数来获取下一条信息
list=[1,2,3]
f=iter(list)
print(next(f)) #1
print(next(f)) #2
print(next(f)) #3
print(next(f)) #报错

 ——————————————————————————————————————————————————

可迭代对象:

什么是可迭代对象呢?
最简单的定义就是:可以使用for..in..语句进行循环的对象,比如字符串,列表,字典以及迭代器、生成器都是可迭代对象

可以使用isinstance()来判断

而迭代器是可以使用next()进行回调的对象,可迭代对象和迭代器的联系是:
可以对迭代对象使用iter()方法来生成迭代器

a=iter([1,2,3])
next(a) #1
next(a) #2
next(a) #3

l=(x*x for x in range(1,11))

总结:
1、迭代器一定是迭代对象,迭代对象不一定是迭代器
2、生成器一定是迭代器,迭代器不一定是生成器
3、使用for..in..来遍历迭代对象是最常用的方式

————————————————————————————————————————————

迭代器要注意的地方:

int整型不是iterable,即int整型不是可以迭代的

使用isinstance()判断一个对象是否是Iterable可迭代对象
需要引入模块
from collections import Iterable
print(isinstance([1,2],Iterable))
结果为:True
表示[1,2]是可迭代对象

可迭代对象包括:
列表,字典,集合,字符串等数据类型
数字类型不可迭代


能帮助我们进行数据迭代的‘人’称为迭代器
这个‘人’去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据

可迭代对象通过_iter_方法向我们提供了一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据
一个具备了_iter_方法的对象,就是一个可迭代对象

iter()函数与next()函数
list,tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据
iter()函数实际上就是调用了可迭代对象的_iter_方法
a=[1,2]
b=iter(a)
print(next(b)) 1
print(next(b)) 2
print(next(b)) 报错

当我们已经迭代完最后一个数据之后,再次调用next()函数会抛出StopIteration的异常,来告诉我们所有的数据都已迭代完成,不再执行next()函数了

如何判断一个对象是否是迭代器
可以使用isinstance()判断
from collections import Iterator
print(isinstance([1,2],Iterator))
结果为:False
print(isinstance(iter([1,2]),Iterator))
结果为:True

迭代器Iterator
通过上面分析,我们已经知道,迭代器是用来帮助我们记录每次迭代访问到的位置,当我们对迭代器使用next()函数的时候,迭代器会向我们返回她所记录位置的下一个位置的数据
实际上,在使用,在使用next()函数的时候,调用的就是迭代器对象的_next_方法
所以我们想要构造一个迭代器,就要实现他的_next_方法
但这还不够,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现_iter_方法,而_iter_方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的_iter_方法返回自身即可

一个实现了_iter_方法和_next_方法的对象,就是迭代器

 ——————————————————————————————————————————

生成器:

f=[x for x in range(3)]
print(f)
结果为:
[0,1,2]

f=(x for x in range(3))
print(f)
结果为:
<generator object <genexpr> at 0x00000167319E2F48>
是一个生成器
要输出里面的元素要用for或者next()
for x in f:
print(x)
结果为:
0
1
2
3