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异常
参考资料:
相关文章推荐
- python基础-迭代器和生成器
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
- python基础:迭代器与生成器
- Python基础教程----迭代器和生成器,递归,八皇后(2)
- Python高手之路【九】python基础之迭代器与生成器
- Python菜鸟之路:Python基础-生成器和迭代器、递归
- Python基础-生成器和迭代器
- python3基础: 元组tuple、 列表list、 字典dict、集合set。 迭代器、生成器
- Python基础02--迭代器、生成器、列表解析
- python基础之迭代器和生成器
- python基础之生成器迭代器
- Python基础(8)_迭代器、生成器、列表解析
- python基础-生成器,迭代器
- python 迭代器、生成器基础知识
- Python基础-迭代器和生成器
- 第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用
- python基础之生成器迭代器
- python基础-迭代器、for底层机制、生成器、list结合yield、__call__、yield函数列表
- 11-Python3从入门到实战—基础之生成器和迭代器
- python基础之生成器迭代器