• 解决python疑难杂症—什么是迭代协议、迭代对象和迭代器?

    什么是迭代协议

    只要某个类型(类)定义了iter()next()方法就表示支持迭代协议。

    iter()需要返回一个可迭代对象。只要定义了iter()就表示能够通过for/in/map/zip等迭代工具进行对应的迭代,也可以手动去执行迭代操作

    1 for x in Iterator
    2 X in Iterator

    同时,可迭代对象还可以作为某些函数参数,例如将可迭代对象构建成一个列表list(Iterator)来查看这个可迭代对象会返回哪些数据:

    L = list(Iterator)

    需要注意的是,for/in/map/zip等迭代工具要操作的对象并不一定要实现iter(),实现了getitem()也可以。getitem()是数值索引迭代的方式,它的优先级低于iter()

    next()方法用于向前一次返回一个结果,并且在前进到结尾的地方触发StopIteration异常。

    再次说明,只要实现了这两个方法的类型,就表示支持迭代协议,可以被迭代。

    例如open()的文件类型:

    在学习过程中有什么不懂得可以加我的
    python学习交流扣扣qun,×××
    群里有不错的学习视频教程、开发工具与电子书籍。
    与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
    1 >>> f=open(‘a.txt‘)
    
    2 >>> dir(f)
    
    3 [... ‘__iter__‘, ... ‘__next__‘, ...]

    但如果看下列表类型、元组、字符串等容器类型的属性列表,会发现没有它们只有iter(),并没有next()

    1 >>> dir(list)
    2 [... ‘__iter__‘, ...]
    3
    4 >>> dir(tuple)
    5 [... ‘__iter__‘, ...]
    6
    7 >>> dir(str)
    8 [... ‘__iter__‘, ...‘]
    9 
    10 >>> dir(set)
    11 [... ‘__iter__‘, ...]
    12
    13 >>> dir(dict)
    14 [... ‘__iter__‘, ...]

    但为什么它们能进行迭代呢?继续看下文"可迭代对象"的解释。

    解决python疑难杂症—什么是迭代协议、迭代对象和迭代器?

    什么是迭代对象和迭代器

    对于前面的容器类型(list/set/str/tuple/dict)只有iter()而没有next(),但却可以进行迭代操作的原因,是这些容器类型的iter()返回了一个可迭代对象,而这些可迭代对象才是真的支持迭代协议、可进行迭代的对象。

    1 >>> L=[1,2,3,4]
    2 >>> L_iter = L.__iter__()
    3 
    4 >>> L_iter
    5 <list_iterator object at 0x000001E53A105400>
    6 
    7 >>> dir(L_iter)
    8 [... ‘__iter__‘, ... ‘__next__‘, ...]
    9 
    10 >>> L.__next__()
    11 Traceback (most recent call last):
    12 File "<stdin>", line 1, in <module>
    13 AttributeError: ‘list‘ object has no attribute ‘__next__‘
    14 
    15 >>> L_iter.__next__()
    16 1
    17 >>> L_iter.__next__()
    18 2
    19 >>> L_iter.__next__()
    20 3
    21 >>> L_iter.__next__()
    22 4

    所以,对于容器类型,它们是通过iter()来返回一个迭代对象,然后这个可迭代对象需要支持迭代协议(有iter()next()方法)。

    也就是说,所谓的迭代对象是通过iter()来返回的。迭代对象不一定可迭代,只有支持迭代协议的迭代对象才能称为可迭代对象

    迭代器则是迭代对象的一种类型统称,只要是可迭代对象,都可以称为迭代器。所以,一般来说,迭代器和可迭代对象是可以混用的概念。但严格点定义,迭代对象是iter()返回的,迭代器是iter()返回的,所以它们的关系是:从迭代对象中获取迭代器(可迭代对象)。

    如果要自己定义迭代对象类型,不仅需要返回可迭代对象,还需要这个可迭代对象同时实现了iter()next()

    正如open()返回的类型,它有iter()和next(),所以它支持迭代协议,可以被迭代。再者,它的iter()返回的是自身,而自身又实现了这两个方法,所以它是可迭代对象:

    1 >>> f = open(‘a.txt‘)
    2 >>> f.__iter__() is f
    3 True

    所以,如果想要知道某个对象是否可迭代,可以直接调用iter()来测试,如果它不抛出异常,则说明可迭代(尽管还要求实现next())。

    相关文章
    相关标签/搜索
    每日一句
      每一个你不满意的现在,都有一个你没有努力的曾经。
    公众号推荐
       一个历史类的公众号,欢迎关注
    一两拨千金
    4887铁筼结果开奖结果小说 晋城| 无极县| 珠海市| 资中县| 喀喇| 五华县| 河池市| 禹城市| 泽库县| 衡东县| 南通市| 祁连县| 嵊泗县| 江北区| 石门县| 乌兰浩特市| 论坛| 临颍县| 云浮市| 商河县| 河津市| 耿马| 马尔康县| 紫阳县| 常山县| 达尔| 淮滨县| 莎车县| 贡觉县| 辉南县| 大兴区| 繁昌县| 平南县| 清镇市| 精河县| 眉山市| 封开县| http://fa.hz0j2r3vo.fun http://fa.hz0j1r7vo.fun http://fa.hz0j0r0vo.fun http://fa.hz0j0r9vo.fun http://fa.hz0j1r9vo.fun