zoukankan      html  css  js  c++  java
  • python中的Iterable对象和Iterator

    参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143178254193589df9c612d2449618ea460e7a672a366000?tdsourcetag=s_pcqq_aiomsg

    可使用for进行迭代的数据类型分为以下两种:

    (1)集合数据类型:如dict、list、tuple、set、str等;

    (2)generator:包括生成器和yield 的generator function;

    注意:

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

    (2)凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

    (3)集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

    (4)第二类对象生成器都是Iterator;

    (5)为什么listdictstr等数据类型不是Iterator

    答:这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算()。Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

    (6)

    (这么说,for对第一类Iterable对象操作时,其实也是先将其变成Iterator,再调用next()函数)

    PS:pytorch中使用torch.utils.data.DataLoader创建的对象是一个接口对象,无法使用

    延伸:

    (1)range和xrange的使用区别:range返回的是一个list,会直接放在内存里(比较占内存);而xrange返回的是一个iterable对象,每次迭代调用next()传入一个单位数据到内存中(更有助于节约内存);

    (2)关于yield关键字:在函数中使用yield时,它会将函数变成一个generator;用for迭代这个generator function时,yield所在位置相当于一个断点,每次都执行完这个断点,下一次迭代再接着运行剩下的部分再直接到下一次断点,功能相当于print;(1)和(2)可参考:http://www.runoob.com/w3cnote/python-yield-used-analysis.html

    (3)python3相对于python2,已不再使用next()方法,改为__next__()方法;

  • 相关阅读:
    一个很好的命令行分享网站
    Docker inside Docker 基于 Alpine Linux
    CentOS 下运行Docker 内执行 docker build 命令的简单方法
    CentOS 安装 Harbor的简单过程(仅使用http 未使用https)
    [财务会计] 表外科目
    jira 插件介绍地址
    Linux 下安装nginx的总结 (之前写的有问题))
    Jira 的 数据库备份恢复 简单过程
    Jira 7.2.4简单安装过程
    Tomcat绑定具体IP
  • 原文地址:https://www.cnblogs.com/liuys635/p/12262659.html
Copyright © 2011-2022 走看看