python 3 生成器generator的构造和使用

2025-05-16 00:43:20

1、构造生成器通常需要写类似函数的代码,但是一种简单的构造生成器generator的方式是使用推导式,如图gen1语句。这种构造语句与列表推导式非常相似,但是其行为和列表推导式是不同的,下面分析执行结果。

python 3 生成器generator的构造和使用

2、执行上述代码后,发现:列表推导式构造完成的同时,所有元素也都求值完成。生成器并未对元素序列求值,而是在使用它的for循环处才求值。

python 3 生成器generator的构造和使用

3、功能复杂的生成器往往需要写类似函数的代码,如图所示。注意yiel蟠校盯昂d和return的区别。return意味着生成器的迭代结束,对应StopIteration异常;而yield的值会被使用者读取。一个生成器在结束之前往往多次yield。图中的gen_prime(50)和gen_prime(100)分别创建了生成器generator对象,并交给for循环用于迭代取值,直到迭代结束。

python 3 生成器generator的构造和使用

4、当我们调用一个生成器的def,得到一个生成器generator对象后:除了使用for循环来依次取值,还可以使用next来取一个生成器yield的值,如图。而且,生成器的迭代可以是无限的,如图的生成质数的生成器,就是一个逻辑上会无限yield的生成器。

python 3 生成器generator的构造和使用
python 3 生成器generator的构造和使用

5、当然,如果我们用一个可以无限次yield的生成器,我们希望在某些条件下结束迭代,就要调用生成器的close()方法,如图所示。调用close()后,下次再次对生成器求next的时候,会抛出StopIteration,如果是for循环会结束。

python 3 生成器generator的构造和使用

6、有时候,如果我们希望生成器结束执行抛出异常,可以调用其throw方法,如图所示。

python 3 生成器generator的构造和使用

7、生成器还可以在迭代过程中接受外部输入。下面再看一个使用生成器写一稍僚敉视个“DNA转录程序”的例子。注意红框圈出的代码。yield语句其实是表达式,造成生成器逻辑暂停的同时,yield不仅返回了一个值,同时外面送进来的值会作为yield表达式的值,赋值给了图中base。

python 3 生成器generator的构造和使用

8、我们同时创建了如图DNA片段字符串,并用DNA字符串创建一个用来提供转录的输入生成器DNAgen,并调用transcrib髫潋啜缅er()得到一个用于转录的生成器tbr。使用如图的代码完成了对DNA的转录输出。注意其中对tbr调用send函数,他将输入值送给生成器tbr,并等效于一次next,得到转录结果。下方可以看到转录输出。

python 3 生成器generator的构造和使用

9、生成器还有很多其它用途,比如RealPython上提到的,基于生成器惰性求值的特点,可按行读取处理大文件而避免整个读入内存爆炸,通过生成器套生成器实现一个处理数据的“流水线”。

python 3 生成器generator的构造和使用
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢