1.什么是生成器?
生成器是由一个函数和yield关键字创建出来的生成器最大的作用就是帮助我们节省内存空间
比如,当我们需要使用一个1-100000的列表,遍历每一个数进行操作,我们首先会想到的就是创建一个列表,然后遍历该列表,如下
var = [i for i in range(100001)]
print(var)
for i in var:
print(i)
我们通过推导式创建了一个列表,存储着我们需要的所有数据,虽然在功能上没有问题,但是巨大的列表消耗了我们大量的内存,那么我们该如何解决呢?
生成器就可以很好的解决该问题,他的原理就是每次调用生成器,都只会生成一个对象供我们操作。这样也可以实现功能,同时节省内存
2.如何创建一个生成器?
当执行生成器函数的时候,知识生成了一个生成器,并没有执行函数代码
当next调用的时候,会执行到yiled,将yield的右侧值返回,并保存此时函数的执行位置,当再次调用next的时候,再执行到yield,返回yiled右侧的数值,再次记录执行的位置,直到函数结束,就会抛出一个StopIteration的异常
# 创建一个生成器函数 def gen(total): for i in range(total): yield i # 创建 一个生成器 ge = gen(100000) # 执行一次yield print(next(ge)) # 1 print(next(ge)) # 2 print(next(ge)) # 3 print(next(ge)) # 4
对于生成器,我们可以使用for进行迭代
def gen(total): for i in range(total): yield i ge = gen(10) for i in ge: print(i, end=' ') # 0 1 2 3 4 5 6 7 8 9
3.生成器进阶
有时候我们希望给生成器传递一些参数来控制程序的运行,就可以使用send函数
send函数和next函数都可以使得生成器执行下一步返回一个对象,所不同的是send可以传递参数
def gen(total): for i in range(total): v = yield i print(v) # 生成一个生成器对象 ge = gen(10) # 执行到yield,返回数字0,阻塞住,此时v还没有完成赋值 res = next(ge) print(res) # 1 # 函数继续执行,完成v的赋值 v = 10,执行print,再次执行到yield,返回1,然后阻塞住 print(ge.send(10))
注意:当生成器第一次调用的时候,最好使用next方法,如果一定要用send,则传递的参数为None,即send(None)
标签:生成器,yield,next,ge,print,gen From: https://www.cnblogs.com/victor1234/p/16852455.html