1. 生成器函数定义
    #函数中定义了yield,并不是普通函数,而是生成器函数
    #yield 返回数据,让函数分段执行
    #return 返回数据,结束本函数调用
    def fun():
     print('调用函数1')
     yield 'raa'
     print('调用函数2')
     yield 'roo'
     print('调用函数3')
     yield 'rtt'
     # print('报错')   #最后一个yield后面代码块,使用__next__迭代会报错
    g = fun()   #通过fun()创建生成器
    #第一次迭代(循环)
    print(g.__next__()) #返回raa

    结果:
    F:\myPy\venv\Scripts\python.exe F:/myPy/test.py
    调用函数1
    raa

#第一次迭代(循环)
print(g.__next__()) #返回raa
#第二次迭代(循环)
print(g.__next__()) #返回roo

结果:
F:\myPy\venv\Scripts\python.exe F:/myPy/test.py
调用函数1
raa
调用函数2
roo

#第一次迭代(循环)
print(g.__next__()) #返回raa
#第二次迭代(循环)
print(g.__next__()) #返回roo
#第三次迭代(循环)
print(g.__next__()) #返回rtt

结果:
F:\myPy\venv\Scripts\python.exe F:/myPy/test.py
调用函数1
raa
调用函数2
roo
调用函数3
rtt

  1. 生成器函数使用循环,(详情见:for循环本质)

    def fun():
     yield 'raa'
     yield 'roo'
     yield 'rtt'
    g = fun()   #生成器函数与for循环本质是一个迭代器,可以迭代
    for i in g: 
     print(i)

    结果:
    F:\myPy\venv\Scripts\python.exe F:/myPy/test.py
    raa
    roo
    rtt

  2. send()
    #__next__ 可以让生成器向下执行一次
    #send 可以让生成器向下执行一次,给上一个 yield 传值,不能给最后一个 yield 传值
    def fun():
     a = yield 'raa'
     print('a=',a)
     b= yield 'roo'
     print('b=',b)
     yield 'rtt' #最后不可send传值
    g = fun()
    print(g.__next__()) #首次不可用send,会报错
    print(g.send(1))
    print(g.send(2))
    print()
    g = fun()
    print(g.__next__())
    print(g.send('qq'))
    print(g.send('rr'))

    结果:
    F:\myPy\venv\Scripts\python.exe F:/myPy/test.py
    raa
    a= 1
    roo
    b= 2
    rtt
    raa
    a= qq
    roo
    b= rr
    rtt