• 迭代器


    1、迭代

      如果给定一个list或tuple,我们要想访问其中的某个元素,我们可以通过下标来。如果我们想要访问所有的元素,那我们可以用for循环来遍历这个list或者tuple,而这种遍历我们就叫做迭代。

      软件开发就是典型的迭代更新。

    2、可迭代协议:只要含有__iter__()方法的都是可迭代的

      可以被for循环的都是可迭代的,要想可迭代,内部必须有一个__iter__方法。

      字符串、列表、元组、字典、集合、打开的文件句柄,range(),enumerate都可以被for循环,说明他们都是可迭代的

    print('__iter__' in dir(int))     #false
    print('__iter__' in dir(list))
    print('__iter__' in dir(dict))
    print('__iter__' in dir(set))
    print('__iter__' in dir(tuple))
    print('__iter__' in dir(bool))   #false
    print('__iter__' in dir(enumerate([])))
    print('__iter__' in dir(range(10)))

      可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法

    # 执行list([1,2])的__iter__方法,得到了一个list_iterator(迭代器)
    print([1,2].__iter__()) 运行结果: <list_iterator object at 0x1024784a8>

    3、迭代器协议:内部同时含有__next__()方法和__iter__()方法

    from collections import Iterable
    from collections import Iterator
    
    class A:
        def __iter__(self):pass
        # def __next__(self):pass
    a = A()
    print(isinstance(a,Iterator))       # 不是迭代器
    print(isinstance(a,Iterable))       # 可迭代的:True
    # 迭代器的好处:
        # 【不依赖索引】迭代器的__next__方法从容器类型中一个一个的取值,会把所有的值都取到
        # 惰性计算,可以节省内存空间【range,f=open()】
        # 迭代器并不会在内存中再占用一大块内存,而是随着循环,每次(next)生成一个
    
    # 迭代器的缺点:
        # 不如按索引取值方便
        # 一次性,只能往后取,不能往回退

    4、可迭代对象和迭代器的转换

    #可迭代的  ==>  迭代器
            # 可迭代的.__iter__()方法
            # 可迭代的 + __next__()方法 (+的意思是拥有)
    
    # 迭代器一定是可迭代的,反之不对    

    l = [1,2,3,4]
    l_iter = l.__iter__()      # 可迭代对象变成迭代器
    while True:
        try:          #处理 “一直取next取到迭代器里已经没有元素”的异常
            item = l_iter.__next__()
            print(item)
        except StopIteration:
            break

     5、for循环的实质

    l = [1,2,3]
    for i in l:
        print(i)
    
    ------------------------------------------------------------------------------------
    
    l = [1,2,3]
    iterator = l.__iter__()      # 可迭代的.__iter__()方法就可以得到一个迭代器
    print(iterator.__next__())     # 1
    print(iterator.__next__())     # 2
    print(iterator.__next__())     # 3
    print(iterator.__next__())     # StopIteration
  • 相关阅读:
    跌到哪儿会反弹
    训练看盘能力的方法
    如何设置ListView控件中的列头的颜色!
    市场正在构筑顶部的几个明显征兆
    Managing Unhandled Exceptions in .NET
    Eclipse 3.3.2中配置Visual Editor
    杨建:网站加速系统架构篇
    杨建:网站加速服务器编写篇
    杨建:网站加速实例分析篇
    涨停技术-教你如何捕捉涨停版best
  • 原文地址:https://www.cnblogs.com/timetellu/p/10681279.html
Copyright © 2020-2023  润新知