iterable

能够一次返回一个成员的对象,iterable包括:所有的sequence序列类型(如:list,str,tuple),一些非序列类型如:(dict,file object和使用 iter() 方法或使用实现 Sequence 语义的 getitem() 方法定义的任何类的对象。)

sequence:通过__getitem__()特殊方法支持使用整数索引访问的可迭代对象iterable,并定义了返回序列长度的__len__()方法。iterable实现了__getitem__()方法和__len__()方法就变为了sequence,对于list,str,tuple都是序列类型。dict虽然也支持这两个方法,但是它不是只支持使用整数索引访问,而是支持immutable keys(不可变的keys)访问,所以它是mapping类型而不是sequence类型。

immutable :不可变对象,包括数字、字符串和元组。这样的对象不能改变。如果必须存储不同的值,则必须创建一个新对象。它们在需要常量哈希值的地方发挥重要作用,例如作为字典中的键。

iterable可以用在for循环中和许多其他需要序列的地方(zip(), map(),…)。当可迭代对象作为参数传递给内置函数 iter() 时,它会返回该对象的迭代器。

使用可迭代对象时,通常不需要调用 iter() 或自己处理迭代器对象,for 语句会自动为您执行此操作,创建一个临时未命名变量以在循环期间保存迭代器。即我们再用for语句访问iterable时,实际上内部已经将其调用iter()方法转为迭代器,然后依次访问。

iterator

iterator是表示数据流的对象,重复调用iterator的 next() 方法(或将其传递给内置函数 next())会返回流中的连续对象。当没有更多数据可用时,会引发 StopIteration 异常。

迭代器需要有一个返回迭代器对象本身的 iter() 方法,所以每个迭代器也是可迭代的,并且可以在大多数接受其他可迭代对象iterable的地方使用。一个值得注意的例外是尝试多次迭代的代码。每次将容器对象(例如列表)传递给 iter() 函数或在 for 循环中使用它时,都会生成一个全新的迭代器。使用迭代器尝试这样做只会返回与前一次迭代中使用的相同的迭代器对象,在原来的基础上接着迭代。

data = [("p", 1), ("p", 2), ("p", 3),("h", 1), ("h", 2), ("h", 3)]a = iter(data)  # 将list(iterable)作为iter的参数,每次会生成新的迭代器iterator
print(next(a))
b = iter(data)
print(next(b))
c = iter(b)  # 将迭代器(iterator)作为iter的参数,不会生成新的迭代器,而是返回传入的迭代器,下次迭代会在该迭代器的基础上接着往后迭代
print(next(c))

iter()

iter() 函数用来生成迭代器,返回值为一个迭代器对象。

iter(object[, sentinel])

参数:

  • object:如果没有传入sentinel参数,则object为支持迭代器协议(实现_iter_()方法的),或者是支持序列协议(实现_getitem_()方法)且是从0开始索引的collection集合对象。
  • sentinel:sentinel 参数是可选的,直译过来是哨兵的意思。如果传递了第二个参数,则参数 object 必须是一个可调用的对象(如,函数),此时,iter 创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用 object,当可调用对象的返回值等于 sentinel 的值时,抛出 StopIteration 的异常,否则返回可调用对象的当前值。

collection:sized iterable container 大小可迭代的容器container类, collection继承container,并实现了__iter__, __len__方法,包括:序列类型,set,mapping等,dict, list, set, and tuple这些都是collection类型,collections模块扩展了更多的collection类型。
container: 提供了 contains()方法的类。包括:序列类型,set,mapping,KeysView,ItemsView等等。

举例说明一下:
常见的,只传入collection类型的数据:

In [5]: iter("123")
Out[5]: <str_iterator at 0x105c9b9e8>
In [6]: iter([1, 2, 3])
Out[6]: <list_iterator at 0x105f9f8d0>

传入sentinel参数:
该场景是创建一个 blokc-reader,即根据条件中断读取。比如:从二进制数据库文件读取固定宽度的块,直到到达文件的末尾,代码示例如下:

from functools import partial
with open('mydata.db', 'rb') as f:# 中断条件为读到b''for block in iter(partial(f.read, 64), b''):process_block(block)

该部分参考:https://zhuanlan.zhihu.com/p/69496512,https://docs.python.org/3/library/functions.html?highlight=iter#iter

总结:

  • iterable是可迭代对象,iterator是迭代器,iter()方法是生成迭代器的方法,iter()方法可以将iterable变为iterator。

  • 直接作用于for循环的对象统称为可迭代对象:Iterable。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

  • 生成器是表示数据流的对象,不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration。

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

更多参考:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128
https://www.liaoxuefeng.com/wiki/1016959663602400/1017316949097888
https://docs.python.org/3/library/functions.html?highlight=iter#iter

iterable、iterator和iter()相关推荐

  1. Python与数据分析

    python基础知识 python魔法用法:a, b = b, a + b 迭代器 生成器 Iterable # coding:utf-8# 生成器(iterator:代表无限大数据流 迭代器是生成器 ...

  2. 增值税电子发票识别-OCR

    设置草图 回复:发票 获取源代码 源码: 发票类型类: public enum InvoiceType {PLAIN_INVOICE("增值税电子普通发票", "0&qu ...

  3. Python可迭代对象和迭代器对象详解

    1.可迭代对象 ''' 迭代对象是一个自身可迭代(__iter__)或者序列(_getitem__) '''# 迭代例子,列表和字符串是可迭代对象 l = [1, 2, 3, 4] s = 'abcd ...

  4. Python笔记-Collection中Iterable、Iterator和Generator的区别

    Iterable Iterable是Python集合的一种,导入方式为from collections import Iterable.Iterable对象都具有__iter__()方法,可以被for ...

  5. java中的Iterator和Iterable 区别

    原文:http://perfy315.iteye.com/blog/1459201 ---------------------------------------------------------- ...

  6. python中iterable_Python的Iterable和Iterator

    Python部落组织翻译,禁止转载,欢迎转发 Iterable: 可迭代的 Iterator:  迭代器 Iterable 可迭代的就是逻辑上是"一排"的东西,比如列表.字典.元组 ...

  7. Java中的Iterable与Iterator详解

    在Java中,我们可以对List集合进行如下几种方式的遍历: List<Integer> list = new ArrayList<>(); list.add(5); list ...

  8. Iterable和Iterator

    Iterable和Iterator 文章目录 Iterable和Iterator 前言 分析源码 自定义迭代器示例 总结 前言 1.Iterable:是一个接口,仅有一个方法的声明,即 Iterato ...

  9. python中的next()以及iter()函数

    我们首先要知道什么是可迭代的对象(可以用for循环的对象)Iterable: 一类:list,tuple,dict,set,str 二类:generator,包含生成器和带yield的generato ...

  10. java中next的用法_关于java iterator的next()方法的用法

    UYOU next()是java迭代器类(Iterator)的方法,获得当前游标指向的下一个元素,详细说明和应用如下:1.迭代器(Iterator)介绍 迭代器是一种设计模式,它是一个对象,它可以遍历 ...

最新文章

  1. Python---图像读写操作(scipy)
  2. Keepalived原理与实战精讲
  3. C++类和对象学习总结
  4. 数学建模上分利器,小论文中稿神器,赶快学习近15年来较新颖的智能优化算法!
  5. 数据结构一:链表(约瑟夫问题)
  6. OSPF DR选举的先后
  7. redis实现简单限流
  8. 深度学习 正则化 正则化率_何时以及如何在深度学习中使用正则化
  9. 2014年Q1台湾域名总量涨幅增95.7% 净增1201个
  10. 强大的端到端语音识别框架—RNN-T
  11. 运维监控三剑客之Zabbix
  12. matlab 超像素合并,基于图论的超像素分割及其合并算法
  13. DWM1000 帧过滤代码实现
  14. 顶级在线图片处理工具Photopea
  15. 实话谈扶贫第一篇——教育扶贫
  16. 从CTF比赛真题中学习压缩包伪加密与图片隐写术【文中工具已打包】
  17. firefox firbug 的“阻挡” blocking
  18. java第四方聚合支付,2017年第四方和第三方聚合支付平台排名
  19. 高清无线投影服务器,投影+高清+无线 教你轻松玩转家庭影院
  20. Java面试大全(2020年版)101-200

热门文章

  1. 理解 Joomla 的几个概念 - 读《Aprees.Begging.Joomla.From.Novice.to.Professional》
  2. pqi 更方便的使用pip源
  3. 通过SQL写FSG报表
  4. retained heap shallow heap 区别及介绍
  5. 每天一道Java编程01-厚度为0.0001米的纸折叠多少次可以折成珠穆朗玛峰8848米的高度?
  6. PROC SUMMARY
  7. Linux Swap 介绍
  8. 广告行业计费模式专业术语
  9. 仿真器和模拟器的区别
  10. Focal Loss 安装与使用 TensorFlow2.x版本