• 迭代器


    一.什么是迭代器

    迭代器即迭代取值的工具

    迭代:

    迭代是一个重复的过程,每一次的重复都是基于上一次的结果来的.

    单纯的重复并不是迭代:

    while True:
        print('1111')

    迭代:

    1 l=['a','b','c']
    2 
    3     def iterator(item):
    4         i=0
    5         while i < len(item):
    6             print(l[i])
    7             i+=1

    二.为什么要有迭代器

    基于索引的迭代器取值方式只适用于列表,元组,字符串类型

    而对于没有索引的字典,集合,文件则不适用

    所以必须找到一种通用的并且不依赖于索引的迭代器取值方式==>迭代器

    迭代器适用于可迭代类型

    三.如何使用迭代器

     1 l=['a','b','c']
     2 i=0
     3 while i < len(l):
     4     print(l[i])
     5     i+=1
     6 
     7 l = ['a', 'b', 'c']
     8 s='hello'
     9 
    10 def iterator(item): #item='hello'
    11     i = 0
    12     while i < len(item):
    13         print(item[i])
    14         i += 1
    15 # iterator(l)
    16 iterator(s)

    可迭代对象:在python中但凡内置有__iter__方法的的对象都是可迭代对象

    字符串,列表,元组,字典,集合,文件都是可迭代对象

    num1=10
    num2=10.1
    s1='hello'
    l=[1,2,3]
    t=(1,2,3)
    d={'x':1}
    s2={1,2,3}
    f=open('a.txt','w')
    
    s1.__iter__
    l.__iter__
    t.__iter__
    d.__iter__
    s2.__iter__
    f.__iter__

    迭代器对象:指的是既有内置__iter__方法,又有内置__next__方法的对象

    执行可迭代对象__iter__方法得到的就是内置的迭代器对象

    文件对象本身就是迭代器对象

    强调:迭代器对象一定是可迭代的对象,反之则不然

    info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
    info_iter=info.__iter__()
    # print(info_iter)
    
    res1=info_iter.__next__()
    print(res1)
    
    res2=info_iter.__next__()
    print(res2)
    
    res3=info_iter.__next__()
    print(res3)
    
    res4=info_iter.__next__()
    print(res4)
    
    info_iter.__next__() # 一旦迭代器取值取干净,再继续取就会抛出StopIteration
    info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
    # info=[1,2,3,4,5]
    info_iter=info.__iter__()
    while True:
        try:
            print(info_iter.__next__())
        except StopIteration:
            break
    for循环:迭代器循环
    info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
    in后跟的一定要是可迭代的对象
    for k in info: # info_iter=info.__iter__()
    print(k)

    f=open('a.txt','r')
    for k in f:
        print(k)

    迭代器对象:指的是即内置有__iter__方法,又内置有__next方法__的对象

    执行迭代器对象的__next__得到的是迭代器的下一个值

    执行迭代器对象的__iter__得到的仍然是迭代器本身

    iter_info=info.__iter__()
    # print(iter_info)
    print(iter_info is iter_info.__iter__() is iter_info.__iter__().__iter__().__iter__().__iter__().__iter__())

    总结迭代器对象的优缺点:

    优点:

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

    2.迭代器对象更加节省内存

    f=open('movie.tar.gz','rb')
    f.__ next__()
    f=open('db.txt','rt',encoding='utf-8')
    
    print(f.__next__())
    print(f.__next__())
    print(next(f)) #f.__next__()
    
    s='hello'
    print(s.__len__())
    print(len(s))
    s.__iter__()
    print(iter(s))

    缺点:

    1.迭代器的取值不如按照索引的方式更灵活,因为它只能往后取而不能往前退

    2.无法预测迭代器值的个数

  • 相关阅读:
    排序:归并排序
    错误编码 = 10022 错误消息 = SDK 组件 Qupaisdk 启动出错,错误消息为 [Qupaisdk], the android stack error message is Fail to start the plugin, which is caused by No implem
    关于百川趣拍64位的问题
    在 APK 中找不到对应的 securityguard***.so 文件或者 so 文件载入出错
    趣拍proguard配置
    android多国语言文件夹
    错误编码 = 17
    阿里百川趣拍接入指南
    Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536
    Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536
  • 原文地址:https://www.cnblogs.com/chillwave/p/9173637.html
Copyright © 2020-2023  润新知