(10)迭代器

什么是迭代器

什么是迭代:迭代就是一个重复的过程,但是每一次重复都是基于上一次的结果而进行的

迭代器就是用来迭代取值的工具

迭代器的优点:

1、提供了一种可以不依赖索引的迭代取值方式

2、迭代器就是一个功能,对于内存只占自身代码需要的内存空间,几乎不占用内存空间

迭代器的缺点:

1、迭代器是一次性的,只能往后一直取,无法在最开始的时候预知迭代器中的值包含的格式

2、无法取到指定的值,不如按照索引取值或者key的取值方式灵活

单纯的重复不是迭代

  while True: 

    print(1)

PS:这个不是迭代,只满足了迭代的一个特点就是重复,每一次的循环都是新的开始,和上一次的循环毫无关联,迭代必须是和上一次的循环有关联的

迭代的过程
l=['a','b','c']
i=0
while i < len(l):
  print(l[i])
  i+=1
PS:这个就是迭代的过程,但是这个只是用一个循环加功能实现迭代的过程,但这个不是迭代器

 

可迭代的对象:但凡内置有__iter__的对象就是可迭代的对象

' '.__iter__()  #字符串类型
[].__iter__()  #列表类型
(1,2).__iter__()  #元祖类型
{'x':1}.__iter__() #字典类型
{1,2,3}.__iter__() #集合类型
open('file').__iter__() #文件类型

PS:调用可迭代对象的__iter__方法会得到一个返回值,该返回值就是迭代器对象

迭代器对象:即内置有__iter__方法又有__next__方法

直接查看类型下面有没有__next__方法,有的就是迭代器对象

PS:文件对象本身就是迭代器对象,为什么python要这样做,因为文件极有可能存储的内容很多,所以python直接将文件做成看迭代器对象

迭代器的使用方法

使用示例

dic={'x':1,'y':2,'z':3}
iter_dic=dic.__iter__()  # 用iter方法将字典变成可迭代对象放入变量
print(iter_dic)  #打印这个变量就可以得到一个提示,这是一个关于字典的迭代器
print(iter_dic.__next__()) #迭代器取值,用迭代器下面的next方法得到值,每执行一次只会得到一个值

使用方法

dic={'x':1,'y':2,'z':3}  
iter_dic=iter()
print(next(iter_dic) 

PS:迭代器取不到值也就是取值结束会报一个错误StopIteration

PS:python中的内置方法都可以有简写方式因为python已经将内置方法封装好了,dice.__iter__()可以写成iter(dice),iter_dic.__next__()可以简写成next(iter_dic)

迭代器的使用实例

dic={'x':1,'y':2,'z':3}

iter_dic=iter(dic)

  while True:

  try:

    print(next(iter_dic))

  except StopIteration:

    break

print('='*100)   #这里后面的代码就是一个循环下连续取值,所以第二次的取值是取不到值得,因为迭代器的特性

iter_dic=iter(dic)

while True: 

  try:

    print(next(iter_dic))

  except StopIteration:

    break

PS:利用异常处理排除迭代器结束后的报错

for循环就是迭代器循环,for循环的原理就是基于迭代器

for循环的底层工作原理:
1、调用in后面那对象的内置方法__iter__,拿到一个迭代器对象iter_obj
2、执行k=next(iter_obj),循环往复直到抛出异常StopIterration
3、for循环在底层会捕捉异常然后结束循环(所以for循环取不到值得时候不会报错

PS:可迭代对象和迭代器对象下面都有iter方法,为什么python要这样设计,就是为了统一for循环的工作机制,因为for循环的原理就是先调用一个值下面的iter方法将值变成可迭代对象,然后调用下面的next方法进行迭代,由于迭代器本身就是可迭代对象,所以迭代器下面的iter方法返回的就是迭代器本身,这样做就不用设计for循环的两套机制原理了,直接将机制原理做了统一

原文地址:https://www.cnblogs.com/shizhengquan/p/10015004.html