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

  1. 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