含有iter和next方法 (包含next方法的可迭代对象就是迭代器)
迭代也叫遍历,作用是节约内存,应用场景:range/xrange,可以使用 isinstance() 判断一个对象是否是 Iterable 对象
可迭代对象 :一个类内部实现iter方法且返回一个迭代器。
可迭代的对象 :
迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。
迭代器协议的实现
迭代器协议规定了对象必须提供一个next方法和iter方法。
正式的说法是:实现了iter方法的对象是可迭代对象,实现了next方法的对象是迭代器。
eg:
li = [11, 22, 33, 44, 55]
>>> li_iter = iter(li)
>>> next(li_iter) ===》 11
>>> next(li_iter) ===》 22
>>> next(li_iter) ===》 33
>>> next(li_iter) ===》 44
>>> next(li_iter) ===》 55
>>> next(li_iter)
Traceback (most recent call last):
File "", line 1, in
StopIteration
优化修改异常报错:
li = iter([11, 22, 33, 44, 55]) # 首先获得Iterator对象:
while True:
try:
next(li_iter)
except StopIteration: #StopIteration意味着没有更多可迭代数据,不能再执行next()函数
break
我们通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。iter()函数实际上就是调用了可迭代对象的_iter__的用法。
注意,当我们已经迭代完最后一个数据之后,再次调用next()函数会抛出 StopIteration的异常,来告诉我们所有数据都已迭代完成,不再执行next()函数了。对此,我们可以用try - except 来做异常处理
生成器是一种特殊的迭代器,与迭代器不同的是,生成器是被动生成,每被调用一次运算一次生成。
作用是节省内存,原因是列表等数据类型是有限的,当列表有100万个数据时,会造成大量资源浪费,和迭代器一样。
python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器。
生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,但是,不同于一般的函数会一次性返回包括了所有数值的数
组,生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像
是一个函数,但是表现得却像是迭代器
要创建一个generator,有很多种方法,第一种方法很简单,只有把一个列表生成式的[]中括号改为()小括号,就创建一个generator
#列表生成式
1.list = [x*x for x in range(10)] #list是可迭代对象(Iterable),却不是迭代器(Iterator)
print(list)
#生成器
2.generator = (x*x for x in range(10)) #generator是一个Iterator
print(generator)
结果:
1 ==》 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2 ==》 at 0x000002A4CBF9EBA0>
list 外面这层[]等于将生成式改为列表类型
生成器函数:也是用def定义的,利用关键字yield一次性返回一个结果,阻塞,重新开始
生成器表达式:返回一个对象,这个对象只有在需要的时候才产生结果
1.迭代器是对可迭代对象所有数据进行遍历,生成器则会暂停,执行一次运行一次
2.生成器是可以迭代的,但是只可以读取它一次
3.都生成器和迭代协议是密切相关的,迭代器都有一个next()__成员方法
扩:文件是可迭代对象,也是迭代器
1、带yield的是generator function。
2、iter()函数是将序列转化为generator,而序列(list、tuple、dict、set、str)是Iterable对象。