一个迭代既可以被写成生成器函数,也可以写成生成器表达式,均支持自动和手动迭代。而且这些生成器只支持一个active迭代,也就是说生成器的迭代器就是生成器本身。生成器(generator)能够迭代的关键是他有next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。
生成器函数:既然是函数,那就是也是用def定义的,函数有了yield之后,函数名() 就变成了生成器,比如func() 是个生成器
直接调用生成器 函数不会运行,要next()调用或者for循环调用函数才会运行
next()调用一次仅返回一个结果(yield右边的数据),下一次调用从yield下一行开始运行,运行到返回yield右边的数据。如果是send()调用,下一次运行时,yield下面的的数据可以调用上一次yield右面运行的结果
生成器表达式:生成器表达式来源于迭代和列表推导式的组合,但是它使用尖括号而不是方括号 ,比如:(x
*
3
for
x
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
,但list
、dict
、str
虽然是Iterable(可迭代对象)
,却不是Iterator(迭代器)
一个实现了iter()方法的对象是可迭代的
一个实现了iter()方法和next()方法的对象就是迭代器。
Python的Iterator
对象表示的是一个数据流,Iterator对象可以被next()
函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration
错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()
函数实现按需计算下一个数据,所以Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算。