• (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循环的两套机制原理了,直接将机制原理做了统一

  • 相关阅读:
    ASP.NET里面,如果设置了form的 onsubmit="return false;"之后,就不能提交按钮了?
    存储过程(待填)
    关于电脑屏幕分辨率太高字太小怎么解决?
    最新版Android开发工具
    Xamarin For Visual Studio 3.0.54.0 完整离线破解版(C# 开发Android、IOS工具 吾乐吧软件站分享)
    ubuntu 16.04 source (HUST and 163)
    transmission简单使用
    Test Tex
    What is a Statistic?
    IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍[zz]
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10015004.html
Copyright © 2020-2023  润新知