迭代器

一、什么是迭代器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()内置方法

 

 

 

posted @ 2020-07-30 23:00  正在学Python  阅读(204)  评论(0编辑  收藏  举报