- 生成器函数定义
#函数中定义了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
- 生成器函数使用循环,(详情见: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
- 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