• 可迭代对象、迭代器、生成器


    可以直接作用于for循环的对象统称为可迭代对象:Iterable

    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

    可以这么认为:

      可以被next()函数调用并不断返回下一个值的Iterable称为迭代器:Iterator


    Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算,所以不能提前知道Iterator序列的长度和数据。

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

    生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

    把list、dict、str等Iterable变成Iterator可以使用iter()函数,list、dict、str等Iterable使用iter()后 不是生成器,因为不是推算出来的:

    代码参考:

    from collections.abc import Iterator
    from collections.abc import Generator

    c = iter('bcd') #字符串是可迭代的,转换成迭代器
    print(c.__next__())
    print(c.__next__())
    print(next(c)) #其实调用的就是__next__()这个方法,for循环本质上也是通过不断调用next()函数实现
    print(isinstance(c,Iterator)) #返回 True 是一个迭代器
    print(isinstance(c,Generator)) #返回 False 不是一个生成器

    生成器 与迭代器 区别:
    生成器是一种特殊的迭代器,迭代器包含生成器,是迭代器不一定是生成器;



    参考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143178254193589df9c612d2449618ea460e7a672a366000

    https://www.cnblogs.com/alex3714/articles/5765046.html

     

  • 相关阅读:
    Django项目总结:项目主页
    变量、常量和作用域
    mysql数据库连接
    多线程下的单例模式
    JVM笔记--类文件结构
    Java初始化与清理
    多线程设计模式-单线程执行模式
    Java语言实现冒泡排序算法
    继承父类并实现多个接口_hehe.base.10.3
    Servlet | Request 对象获取请求参数的通用方式
  • 原文地址:https://www.cnblogs.com/lighthouse/p/9340305.html
Copyright © 2020-2023  润新知