您的位置:首页 > 编程语言 > Python开发

Python基础-迭代器和生成器

2017-04-11 23:18 543 查看

一、可迭代对象

在Python中,我们已经知道,可以直接作用于

for
循环的数据类型有以下几种:

一类是集合数据类型,如

list
tuple
dict
set
str
等;

一类是

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

这些可以直接作用于

for
循环的对象统称为可迭代对象:
Iterable

可以使用

isinstance()
判断一个对象是否是
Iterable
对象:

二、迭代器

可以被

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

Python的

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

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

生成器都是

Iterator
对象,但
list
dict
str
虽然是
Iterable
,却不是
Iterator

list
dict
str
Iterable
变成
Iterator
可以使用
iter()
函数:

三、生成器

在Python中,使用生成器可以很方便的支持迭代器协议。生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果,在每个结果之间挂起和继续它们的状态,来自动实现迭代协议。

也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态。

 

每次调用

next(zrange)
,就计算出zrange的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出
StopIteration
的错误。

小结:

当调用生成器函数的时候,函数只是返回了一个生成器对象,并没有执行。

  • 当next()方法第一次被调用的时候,生成器函数才开始执行,执行到yield语句处停止
  • next()方法的返回值就是yield语句处的参数(yielded value)
  • 当继续调用next()方法的时候,函数将接着上一次停止的yield语句处继续执行,并到下一个yield处停止;如果后面没有yield就抛出StopIteration异常

 

参考资料:

1. http://www.cnblogs.com/alex3714/articles/5765046.html

2. https://www.geek-share.com/detail/2648053760.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: