生成器基础


一、需求

  希望从格式化打印"打印第%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))         #将生成器转换为列表,数据同时存在于内存中。(占内存)