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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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是永远不可能存储全体自然数的。(迭代器相对于列表的优点)

 

 

 

 


以上是关于2017/9/7的学习内容———Python迭代器(老男孩Alex)的主要内容,如果未能解决你的问题,请参考以下文章

python学习——装饰器生成器迭代器

python学习第十三章

Python进阶:迭代器与迭代器切片

python学习---迭代器

python学习--迭代器和异常处理

Python学习---装饰器/迭代器/生成器的学习all