一、需求
希望从格式化打印"打印第%s次"%d ,此时一直打印2000000个。(直接range(2000000)会卡,不希望卡)
二、生成器定义
1.生成器事实上也是迭代器的衍生,自己写的一个生成器,可以极大程度上节省内存。
2.函数使用yield。
3.yield:效果和return差不多,但是不能和return一起出现,yield返回数值之后,函数停留在执行到的地方不动。而return会停止,下次调用会重来。
三、示例
def printx(): for i in range(2000000): yield 'x=%s' % i g=printx() g1=printx() #这是两个生成器
#g.__next__():取一个 count=0 for i in g: print(i) #一边调一边打印。一边生成数据一边处理。 count+=1 if count>50: #任何时候 把count值再加,就可用接着取 break print('***',g.__next__()) #*** x=51
在其中,g=printx()时,实际上并没有创建range(2000000),而在下方打印时,才从内存,一个一个生成返回数据。
四、介绍几个函数:
__iter__():有此方法说明可以迭代。
__next__():有这个方法说明可以一个一个取出来。
__setstate__():可以指定从哪个位置开始取。
__add__():在使用加法的时候,实际上机器翻译成调用__add__方法。
(双下方法一般很少直接调用,一般都是用其他语法触发)
五、总结
1.生成器的本质就是迭代器
2.生成器的表现形式
1)生成器函数
2)生成器表达式
3.生成器函数:含有yield关键字的函数就是生成器函数。
4.生成器函数特点:
1)调用函数之后函数不执行,返回一个生成器。
2)调用__next__方法之后会取到一个值。直到取完最后一个之后会报错。
5.从生成器中取值的几个方法:
1)next
def generator(): for i in range(20000000): yield "打印第%s次"%(i+1) g=generator() print(g.__next__()) #打印第1次
2)for
def generator(): for i in range(20000000): yield "打印第%s次"%i g=generator() num=0 for i in g: num+=1 if num>50: break print(i)
3)数据类型的强制转换
def generator(): for i in range(20): #数据很小, yield "打印第%s次"%(i+1) g=generator() print(list(g)) #将生成器转换为列表,数据同时存在于内存中。(占内存)