zoukankan      html  css  js  c++  java
  • 10-迭代器

    一、迭代器介绍

    1.1 什么是迭代器

        迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复
    都是基于上一次的结果而继续的,单纯的重复并不是迭代

    1.2 为何要有迭代器

        迭代器是用来迭代取值的工具,而涉及到把多个值循环取出来的类型
    有:列表、字符串、元组、字典、集合、打开文件

    二、 迭代器的使用

    2.1 可迭代对象

    但凡内置有__iter__方法的都称之为可迭代的对象
    s1=''
    s1.__iter__()
    
    l=[]
    l.__iter__()
    
    t=(1,)
    t.__iter__()
    
    d={'a':1}
    d.__iter__()
    
    set1={1,2,3}
    set1.__iter__()
    
    with open('a.txt',mode='w') as f:
        f.__iter__()
        pass

    2.2  创建迭代器对象

    调用可迭代对象下的__iter__方法会将其转换成迭代器对象
    字典生成可迭代对象与遍历:
    d={'a':1,'b':2,'c':3}
    d_iterator=d.__iter__()
    print(d_iterator)
    # 结果为 <dict_keyiterator object at 0x000001B76C58CCC0>
    
    print(d_iterator.__next__())
    print(d_iterator.__next__())
    print(d_iterator.__next__())
    print(d_iterator.__next__()) # 抛出异常StopIteration

    使用while循环实现for循环遍历可迭代对象

    while True:
        try:
            print(d_iterator.__next__())
        except StopIteration:
            break
    
    print('====>>>>>>') # 在一个迭代器取值取干净的情况下,再对其取值娶不到
    d_iterator=d.__iter__()
    while True:
        try:
            print(d_iterator.__next__())
        except StopIteration:
            break

    2.3 可迭代对象与迭代器对象详解

    """"
    1 可迭代对象("可以转换成迭代器的对象"):内置有__iter__方法对象
           可迭代对象.__iter__(): 得到迭代器对象
    
    2 迭代器对象:内置有__next__方法并且内置有__iter__方法的对象
           迭代器对象.__next__():得到迭代器的下一个值
           迭代器对象.__iter__():得到迭代器的本身,说白了调了跟没调一个样子
     """
    dic={'a':1,'b':2,'c':3}
    
    dic_iterator=dic.__iter__()
    print(dic_iterator is dic_iterator.__iter__().__iter__().__iter__())

    其中:
    可迭代对象:字符串、列表、元组、字典、集合、文件对象
    迭代器对象:文件对象
    迭代器对象也是可迭代对象

    三、for循环工作原理

    for循环可以称之为叫迭代器循环

    d={'a':1,'b':2,'c':3}
    """
    1、d.__iter__()得到一个迭代器对象
    2、迭代器对象.__next__()拿到一个返回值,然后将该返回值赋值给k
    3、循环往复步骤2,直到抛出StopIteration异常for循环会捕捉异常然后结束循环
    """
    for k in d:
        print(k)

    例子:

    with open('a.txt',mode='rt',encoding='utf-8') as f:
        for line in f: # f.__iter__()
            print(line)
    
    
    list('hello') #原理同for循环

    四、迭代器优缺点总结

    优点:

    I、为序列和非序列类型提供了一种统一的迭代取值方式。

    II、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用next来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,

    而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。

    缺点:

    I、除非取尽,否则无法获取迭代器的长度

    II、只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;

    若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

  • 相关阅读:
    智器SmartQ T7实体店试用体验
    BI笔记之SSAS库Process的几种方案
    PowerTip of the Day from powershell.com上周汇总(八)
    PowerTip of the Day2010071420100716 summary
    PowerTip of the Day from powershell.com上周汇总(十)
    PowerTip of the Day from powershell.com上周汇总(六)
    重新整理Cellset转Datatable
    自动加密web.config配置节批处理
    与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable
    在VS2003中以ClassLibrary工程的方式管理Web工程.
  • 原文地址:https://www.cnblogs.com/zhubincheng/p/12562388.html
Copyright © 2011-2022 走看看