生成器与迭代器

一个迭代既可以被写成生成器函数,也可以写成生成器表达式,均支持自动和手动迭代。而且这些生成器只支持一个active迭代,也就是说生成器的迭代器就是生成器本身。生成器(generator)能够迭代的关键是他有next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。

 生成器函数:既然是函数,那就是也是用def定义的,函数有了yield之后,函数名() 就变成了生成器,比如func() 是个生成器

直接调用生成器 函数不会运行,要next()调用或者for循环调用函数才会运行

next()调用一次仅返回一个结果(yield右边的数据),下一次调用从yield下一行开始运行,运行到返回yield右边的数据。如果是send()调用,下一次运行时,yield下面的的数据可以调用上一次yield右面运行的结果

 生成器表达式:生成器表达式来源于迭代和列表推导式的组合,但是它使用尖括号而不是方括号 ,比如:(x * 3 for in range(5))

它返回一个对象,这个对象只有在需要的时候才产生结果。直接调用生成器不生成数据,生成一个对象,要next()或者for循环才能生成数据

 

带有yield的函数不仅仅是只用于for循环,而且可用于某个函数的参数,只要这个函数的参数也允许迭代参数。(pytest里的conftest 夹具)

生成器函数  引用地址:https://blog.csdn.net/mieleizhi0522/article/details/82142856

生成器与迭代器区别  引用地址:https://www.cnblogs.com/wj-1314/p/8490822.html

 
 
迭代器:

生成器都是Iterator,但listdictstr虽然是Iterable(可迭代对象),却不是Iterator(迭代器)

一个实现了iter()方法的对象是可迭代的

一个实现了iter()方法和next()方法的对象就是迭代器。

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

 
posted @ 2021-03-02 18:16  一只测试小菜鸡  阅读(55)  评论(0编辑  收藏  举报