Iterable-Generator-Iterator
引入:可以 iterable 的数据使用 generator 的方法生成 iterator,针对数据流进行操作。通过 Iterator 对象,在每次调用时( __next__()或者next())才真正计算取值,减少内存的使用;
Iterable - 可迭代对象
what:python中任意对象,只要定义了可以返回一个迭代器的 __iter__方法,或者定义了可以支持下标索引的 __getitem__方法,则该对象为可迭代对象。一句话,可迭代对象就是能够提供迭代器的任意对象。之后会介绍 - 什么是迭代器
举例:
- 序列类型
- list
- str
- tuple
- 非序列类型
- dict
- file
- 任何实现了
__iter__方法的类 - 任何实现了
__getitem__()的类
Iterator - 迭代器
what:python中任意对象,只要定义了next(python2)或者 __next__ 方法,它就是迭代器。
迭代器 Iterator是一个让你可以遍历一个容器(可迭代对象 Iterable)的对象,一个迭代器在遍历并读取一个容器的数据元素时,并不会执行一个迭代 Iteration
Iteration - 迭代
what:从容器中取出元素的过程,当我们使用一个循环来遍历某个对象时,这个过程就叫迭代。
Generator - 生成器
what:首先,生成器也是一个迭代器,但只能迭代一次;因为生成器没有将所有的结构存在内存中,而是运行时使用 yield 生成值。
how:根据生成器的定义,我们可以想到生成器应用场景 - 当不想同一时间将所有计算结果计算出来的大量结果集放入内存中时,或读取大文件时避免消耗大量资源,可以通过遍历来使用生成器,for 循环或将生成器传递给任何可以进行迭代的函数和结构,利用其运行时生成值的特性。如下是两个生成器的列子:
# example 1:
def generator_fun():
for i in range(5):
yield i
for item in generator_fun():
print(item)
# output:
# 1
# 2
# 3
# 4
# 5
# example 2:计算斐波那契数列
def fibon(n):
a = b = 1
for i in range(n):
yield a # 调用时生成值,不会同时将所有值放入内存
a, b = b, a + b
# 使用
for x in fibon(1000000):
print(x)
总结:
| 名词 | 定义 | 实现/用途 |
|---|---|---|
| Iterator | 一个对象,代表了一串数据流 | 使用next() 方法或内置函数 next() 返回连续的对象,没有数据返回时,抛出 StopIteration 异常 |
| Iterable | 一个对象,能每次返回数据组中的一个成员 | for 循环中每次返回一个值或内置函数 iter() 传入参数返回 iterator 对象 |
| Generator | 使用了 yield 或者生成器表达式,生成 iterator 对象 | 用一种方法便实现了 iterator ,在 for 循环取数据或使用 next() 取数据 |