zoukankan      html  css  js  c++  java
  • 25、Python之迭代器

    一、什么是迭代器

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

    二、为什么要有迭代器

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

    l=['egon','liu','alex']
        i=0
        while i < len(l):
            print(l[i])
            i+=1	
    

    上述迭代取值的方式只适用于有索引的数据类型:列表、字符串、元组,为了解决基于索引迭代器取值的局限性,python提供了一种能够不依赖于索引的取值方式,这就是迭代器。

    三、如何使用迭代器

    3.1 可迭代对象(iterable)

    # 从语法形式上讲,内置有__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
    

    3.2 迭代器对象

    ## 调用可迭代对象下的__iter__方法会将其转换成迭代器对象 ##
    
    d={'a':1,'b':2,'c':3}
    d_iterator=d.__iter__()
    print(d_iterator)  # <dict_keyiterator object at 0x000001E3EFA4A9F0>
    
    print(d_iterator.__next__())  # a
    print(d_iterator.__next__())  # b
    print(d_iterator.__next__())  # c
    print(d_iterator.__next__())  # 抛出异常StopIteration
    
    # 此时,引入try-except 语句,进行异常监控, 提供处理异常的机制
    while True:
        try:
            print(d_iterator.__next__())
        except StopIteration:
            break  # 此时,可以取出字典内所有的key值
    
    print('====>>>>>>') # 在一个迭代器取值取干净的情况下,再对其取值取不到,除非再次制造一个迭代器
    d_iterator=d.__iter__()  # 再次制造一个迭代器
    while True:
        try:
            print(d_iterator.__next__())
        except StopIteration:
            break
    
        l=[1,2,3,4,5]  # 使用列表也是一样的方法使用迭代器取值
    l_iterator=l.__iter__()
    
    while True:
        try:
            print(l_iterator.__next__())
        except StopIteration:
            break
    

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

    # 3.1 可迭代对象("可以转换成迭代器的对象"):内置有__iter__方法对象
    #        可迭代对象.__iter__(): 得到迭代器对象
    
    # 3.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__())  # True
    

    3.4 常见的迭代器对象与可迭代对象数据类型

    # 可迭代对象:字符串、列表、元组、字典、集合、文件对象
    # 迭代器对象:文件对象
    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__()
        f.__next__()
    

    3.5 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循环
    

    3.6 迭代器对象的优缺点

    3.6.1 优点:

    # I、为序列和非序列类型提供了一种统一的迭代取值方式。
    # II、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用next来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。
    

    3.6.2 缺点:

    # I、除非取尽,否则无法获取迭代器的长度
    # II、只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。
    
  • 相关阅读:
    CodeForces gym Nasta Rabbara lct
    bzoj 4025 二分图 lct
    CodeForces 785E Anton and Permutation
    bzoj 3669 魔法森林
    模板汇总——快读 fread
    bzoj2049 Cave 洞穴勘测 lct
    bzoj 2002 弹飞绵羊 lct裸题
    HDU 6394 Tree 分块 || lct
    HDU 6364 Ringland
    nyoj221_Tree_subsequent_traversal
  • 原文地址:https://www.cnblogs.com/zuiyouyingde/p/12559500.html
Copyright © 2011-2022 走看看