import time
def test():
    print("开始生孩子!!!")
    yield "儿子"
    time.sleep(2)            #两秒之后再执行
    print("开始生孙子啦")
    time.sleep(2)
    yield "孙子"
res=test()
print(res.__next__())          #运行完这行,会显示儿子,而这个函数会停留再这里(保留函数的运行状态,区别于return会使函数结束,yield会让函数停留再某一阶段)
print(res.__next__())           #等两秒之后,会从上一步迭代器停留的位置继续运行,会显示孙子

  👆👆👆以上是通过函数的形式生成迭代器。(能够通过—next—挨个输出)

 

生成器函数的好处:

  举例:两种方法卖包子

方法1:全生产出来,再去卖。需要创立一个列表,把生产出来的所有包子全部放进去

def baozi_product():
    ret=[]
    for i in  range(1,100):
        ret.append("第%s屉包子" %i)
    return  ret
res=baozi_product()
print(res)

  

方法2:生产一个,就卖一个,这里需要用到yield生成一个迭代器,然后通过next函数进行一个个的输出,而且要保留函数的运行状态

def baozi_product():
    for i in range(1,100):
        yield "第%s屉包子" %i
res=baozi_product()
print(res.__next__())        #输出结果为第1屉包子,遇到yield会停留,等到下一个next时,再继续进行循环
print(res.__next__())        #输出结果为第2屉包子
print(res.__next__())        #......

  

例题:母鸡下蛋的传说

  需求1:母鸡下蛋,下100个鸡蛋,没有生成器

def mujixiadan():
    ret=[]
    for i in range(1,101):
        ret.append("egg%s" %i)
    return  ret
print(mujixiadan())

#输出一个1-100个列表

  (缺点:占用空间大,效率较低)

  需求2:下一个鸡蛋给一个鸡蛋

def mujixiadan():
    for i in range(1,101):
        print("第%s个出来啦"%i)
        yield "给你第%s个蛋"%i
        print("下蛋中")

res=mujixiadan()
print(res.__next__())             #来一个人取鸡蛋,就下一个
print(res.__next__())
print(res.__next__())