zoukankan      html  css  js  c++  java
  • 可迭代对象、迭代器、生成器

    可以直接作用于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

     

  • 相关阅读:
    ORA-28000: the account is locked-的解决办法
    j对ava序列化的学习理解
    Oracle数据库中的时间格式和java中时间格式的转换
    抽象类和接口的区别
    glVertexAttribPointer
    运算符重载
    lua回调时把函数当参数传递时需注意的事项
    visual studio 编译文件生成路径
    UITableView自定义Cell中,纯代码编程动态获取高度
    ASP.NET发送邮件(QQ发送)
  • 原文地址:https://www.cnblogs.com/lighthouse/p/9340305.html
Copyright © 2011-2022 走看看