博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python迭代器
阅读量:7092 次
发布时间:2019-06-28

本文共 1566 字,大约阅读时间需要 5 分钟。

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yield的generator function。

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

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

from collections import Iterableprint(isinstance([],Iterable)) #Trueprint(isinstance({},Iterable)) #Trueprint(isinstance('123',Iterable)) #Trueprint(isinstance((x for x in range(10)),Iterable)) #Trueprint(isinstance(123,Iterable)) #False

 

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

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

判断一个对象是否是Iterator对象:

from collections import Iteratorprint(isinstance([],Iterator)) #Falseprint(isinstance({},Iterator)) #Falseprint(isinstance('123',Iterator)) #Falseprint(isinstance((x for x in range(10)),Iterator)) #Trueprint(isinstance(123,Iterator)) #False

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

from collections import Iteratorlist1 = iter(range(10))print(isinstance(list1,Iterator))  #Trueprint(list1.__next__())#0print(list1.__next__())#1print(list1.__next__())#2

 

你可能会问,为什么listdictstr等数据类型不是Iterator

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

小结

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

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

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

 

参考文档:

 

转载于:https://www.cnblogs.com/qing-chen/p/7268611.html

你可能感兴趣的文章
Python3 序列解包
查看>>
C/C++ —语言判断数字或字符的函数总结
查看>>
ParentalControl-SteadyState
查看>>
设计模式 — 结构型模式 适配器模式
查看>>
Tempter of the Bone------剪枝
查看>>
Java学习笔记---IO操作
查看>>
Hadoop2
查看>>
"Chinese Pinyin"App-隐私政策
查看>>
java多态性,父类引用指向子类对象
查看>>
机器学习入门03 - 降低损失 (Reducing Loss)
查看>>
Material Design(七)--Snackbar
查看>>
文件MD5
查看>>
收集的博客网址springboot、cloud
查看>>
解析函數論 Page 29 命題(3) 模的下界的可達性
查看>>
windows异常调用顺序
查看>>
红黑树
查看>>
Sass
查看>>
Objective-C中Block语法、Block使用以及通过Block实现数组排序
查看>>
[转载]从业务运维转到产品经理,我摸爬滚打的产品之路
查看>>
比较正在使用的域名 和顶层窗口的域名
查看>>