2017/9/7的学习内容———Python迭代器(老男孩Alex)

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

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

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

 

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

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

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

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

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

>>> from collections import Iterable
>>> isinstance([],Iterable)
True
>>> isinstance(('abc','awe'),Iterable)
True
>>> isinstance({},Iterable)
True
>>> isinstance(123,Iterable)
False

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

  即 我们得出,可以被next()调用并返回下一个值的object 为: 迭代器 Iterator

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

 eg: 列表不是迭代器

  

>>> a = [1,2,3]
>>> dir(a)
['__add__', '__class__', '__contains__',
 '__delattr__', '__delitem__', '__dir__'
    , '__doc__', '__eq__', '__format__',
 '__ge__', '__getattribute__',
 '__getitem__', '__gt__', '__hash__',
 '__iadd__', '__imul__', '__init__',
 '__iter__', '__le__', '__len__',
 '__lt__', '__mul__', '__ne__',
 '__new__', '__reduce__',
 '__reduce_ex__', '__repr__',
 '__reversed__', '__rmul__',
 '__setattr__', '__setitem__',
 '__sizeof__', '__str__',
 '__subclasshook__', 'append', 'clear',
 'copy', 'count', 'extend', 'index',
 'insert', 'pop', 'remove', 'reverse',
 'sort']
#列表中没有next调用方法,不是迭代器

可以发现 列表的方法中没有__next__ 故不是迭代器

  

>>> from collections import Iterator
>>> isinstance((x for x in range(5)),Iterator)
True
>>>列表生成式(生成器)是生成器)
>>> isinstance({},Iterator)
False
列表、元祖等都不是迭代器

 转自(金角大王)

 

list、dict、str等Iterable变成Iterator 可以使用内置方法: iter()

iter()函数
>>> a = [1,32,444]
>>> b = iter(a)
>>> b.__next__()
1
>>> b.__next__()
32
>>> b.__next__()
444
>>>>>> b.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration 没有数据时 抛出异常

 

 

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

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

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。(迭代器相对于列表的优点)

 

 

 

 

posted @ 2017-09-07 23:16  Iriving  阅读(588)  评论(0)    收藏  举报