python中迭代器和生成器
作者:大鼻子小杨
链接:https://www.zhihu.com/question/20829330/answer/395765628
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://www.zhihu.com/question/20829330/answer/395765628
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1. 迭代器(Iterator)
这里的迭代可以指for循环,在Python中,对于像list,dict和文件等而言,都可以使用for循环,但是它们并不是迭代器,它们属于可迭代对象。
1.1 什么可迭代对象
最简单的解释:可以使用for...in...语句进行循环的对象,就是可迭代对象(Iterable),可以使用isinstance()方法进行判断。
from collections import Iterable
type = isinstance('python', Iterable)
print type
1.2 什么是迭代器
迭代器指的是可以使用next()方法来回调的对象,可以对可迭代对象使用iter()方法,将其转换为迭代器。
temp = iter([1, 2, 3])
print type(temp)
print next(temp)
此时temp就是一个迭代器。所以说,迭代器基于两个方法:
- next:返回下一个项目
- _iter_ 返回迭代器本身
可理解为可被next()函数调用并不断返回下一个值的对象就是迭代器,在定义一个装饰器时将需要同时定义这两个方法。
迭代器的优势
在构建迭代器时,不是将所有的元素一次性的加载,而是等调用next方法时返回元素,所以不需要考虑内存的问题。
迭代器应用场景
那么,具体在什么场景下可以使用迭代器呢? - 数列的数据规模巨大
- 数列有规律,但是不能使用列表推导式描述。
2. 生成器
生成器是一种高级迭代器,使得需要返回一系列元素的函数所需的代码更加的简单和高效(不像创建迭代器代码那般冗长)。
2.1 生成器函数
生成器函数和常规函数都采用def语句进行定义,但是基于yield指令返回一个值,可以暂停一个函数并返回中间结果。当需要一个将返回一个序列或在循环中执行的函数时,就可以使用生成器,因为当这些元素被传递到另一个函数中进行后续处理时,一次返回一个元素可以有效的提升整体性能。
常见的应用场景是使用生成器的流数据缓冲区。
2.2 生成器表达式
生成式表达式是一种实现生成器的便捷方式,将列表推导式的中括号替换为圆括号。
和列表推导式的区别:列表生成式可以直接创建一个表,但是生成器表达式是一种边循环边计算,使得列表的元素可以在循环过程中一个个的推算出来,不需要创建完整的列表,从而节省了大量的空间。
g = (x * x for x in range(10))
总结:生成器是一种高级迭代器。生成器的优点是延迟计算,一次返回一个结果,这样非常适用于大数据量的计算。但是,使用生成器必须要注意的一点是:生成器只能遍历一次。