一、什么是迭代器iterator
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代
可迭代对象:可以转换成迭代器的对象。内置有__iter__方法的都是可迭代对象。
调用可迭代对象下的__iter__方法就可以将其转换为迭代器对象。然后就可以迭代取值啦~
迭代器取值 通过执行 迭代器的 __next__()方法就可以啦~
迭代器中多有的值都取完之后,在执行__next__()方法就会抛出StopIteration异常。
自定义的迭代器,就是生成器。它弥补了只能用__iter__转换可迭代对象生成迭代器的不足。迭代器本身是节省内存空间,但是用__iter__方法,需要先有占用内存的可迭代对象。所以自定义迭代器是很好的选择。
二、为何有迭代器
迭代器是用来迭代取值的工具,而涉及到把多个值循环取出来的类型有:列表,字符串,元祖,字典,集合,打开文件。
列表,字符串,元祖可以使用索引迭代取值,字典,集合,文件不行。
python必须提供一种能够不依赖于索引的取值方式,这就是迭代器。
for 循环的工作原理
1.调用对象的__iter__方法,得到一个迭代器对象
2.调用迭代器对象的__next__方法,拿到返回值
3.循环步骤2,直到抛出StopIteration异常,for循环会捕捉异常并结束循环。
迭代器的优缺点
1.获得了统一的迭代取值的方案
2.迭代器节省内存,同一时间在内存里只有一个值,next调用一次才有一个值
3.不能像索引一样,想去哪个值,就取哪个,必须要一个个next
4.迭代器有生命周期,取完值后就再取不到了
5.除非取进。否则无法获取迭代器的长度
三、如何自定义迭代器(如何定义生成器generator)
在函数内一旦存在yield关键字,调用函数并不会执行函数体代码,会返回一个生成器对象,就是一个自定义的迭代器。
def func():
#return ----> 碰到就结束
#yield ----> 碰到后,在这停住
print('第一次‘)
yield 1
print('第二次‘)
yield 1
print('第三次‘)
yield 1
g = func() # 调用函数 返回一个生成器对象
g.__iter__()
res1 = g.__next__() # 调用next方法,会触发函数体代码的运行,然后遇到yield停下来,将yield后的值当做本次调用的结果返回。res1 =1
res2 = g.__next__() # 再次调用next方法,接着往下走。res2 = 2。直到值取完之后,抛出异常。也可以用next()内置方法,iter()内置方法