• python中的迭代器


    1、为何要有迭代器?
      对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。
      但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器

    2、什么是可迭代对象?
    可迭代对象

    • 以直接作用于 for 循环的数据类型有以下几种:
    • 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
    • 一类是 generator ,包括生成器和带 yield 的generator function。
    • 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。

    判断是否可以迭代?

    可以使用 isinstance() 判断一个对象是否是 Iterable 对象:

    In [1]: from collections import Iterable
    In [2]: isinstance({}, Iterable)
    Out[2]: True
    In [3]: isinstance(100, Iterable)
    Out[3]: False  

    可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下:

    • 'world'.__iter__
    • (4,5,6).__iter__
    • [1,2,3].__iter__
    • {'a':1}.__iter__
    • {'a','b'}.__iter__
    • open('a.txt').__iter__

    3、什么是迭代器对象?

    1. 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
    2. 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
    3. 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

    可以使用 isinstance() 判断一个对象是否是 Iterator 对象:(用法与isinstance一样)

    实例:

    a='abcdefg'
    a1={'a','b','c','d','e'}
    a2={'a':1,'b':12,'c':'cd'}
    
    res=iter(a1) #集合无序
    print(next(res))
    print(next(res))
    print(next(res))
    >>> e
    >>> d
    >>> c
    res2=iter(a2) #字典出来的是key
    print(next(res2))
    print(next(res2))
    >>> a
    >>> b
    res=iter(a1)
    n=0
    whilen<len(a2):
    print(next(res))
    n += 1
    >>> d
    >>> e
    >>> c 

    4、文件类型是迭代器对象
      open('a.txt').__iter__()
      open('a.txt').__next__()

    5、总结

      1、凡是可作用于 for 循环的对象都是 Iterable 类型;

      2、凡是可作用于 next() 函数的对象都是 Iterator 类型;

      3、集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数转化成 Iterator 对象;

      4、生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。

    作者:无荨

    -------------------------------------------

    个性签名:学IT,就要做到‘活到老学到老’!

    如果觉得这篇文章对你有小小的帮助的话,别忘记点个“推荐”哦!

  • 相关阅读:
    三分法
    牛客网 TaoTao要吃鸡 ( 0/1背包变形 )
    POJ 3275 Ranking the cows ( Floyd求解传递闭包 && Bitset优化 )
    Codeforces 912E Prime Gift ( 二分 && 折半枚举 && 双指针技巧)
    Codeforces 912D Fishs ( 贪心 && 概率期望 && 优先队列 )
    Codeforces 919D Substring ( 拓扑排序 && DAG上的DP )
    队列构造拓扑排序
    Codeforces 919E Congruence Equation ( 数论 && 费马小定理 )
    Codeforces 916B Jamie and Binary Sequence ( 模拟 && 思维 )
    POJ 1769 Minimizing maximizer ( 线段树 && DP )
  • 原文地址:https://www.cnblogs.com/twoo/p/11672260.html
Copyright © 2020-2023  润新知