假如要生成一个1-100的数字,若采用lis = [i for i in range(101)]的方式,则会把100个数字一次性获取到,如果加大数字量,生成1-10000000000000000000的数字,若仍采用上述列表解析的方式,会占用大量的资源,CPU运行会出现问题。若采用生成器(generator)的方式,一次只获取一个数字,并且在规定范围内想获取多少就获取多少,就会极大的减少资源的占用,并且可以保存算法。

1、生成器方式一:
将列表解析的中括号[]换成小括号(),每调用一次next()方法,就会获取一个值,不调用next()方法生成器就不会运行,若越界会报错



2、生成器方式二:yield 值
a、调用生成器函数,得到一个生成器对象,但这个生成器函数并没有执行
b、next调用得到的生成器对象,如果遇到了yield,代码会阻塞,next的返回值就是yield后的值


3、send的使用:
第一种和第二种,一旦生成器确定,算法不能改变。
这里的例子,定义了变量(temp),可以使用send发送参数,发给这里变量。
根据这个变量的值的不同,可以改变算法的逻辑。
所以,这种写法的作用:在运行过程中,可以改变算法


4、模拟协程:


网友评论