立即学习:https://edu.csdn.net/course/play/19711/255579?utm_source=blogtoedu
1.yield = return + generator
yield是一个返回的是一个生成器对象,是通过next函数一次一次地进行函数地迭代来获取结果的,而return函数则是将结果返回后,不再与函数有关系了
# #单步生成
#
def gererator():#由于yield的存在,使得这个函数是一个生成器print('[gererator]yield执行前')yield 'iterm = 1'#执行到这行代码后,会将值返回,并且暂停在此,等待下一次next或者send函数的调用,再次从这里继续运行,注意最后一定需要将结果返回,否则会报错StopIteration,因为生成器本身就是一个迭代,停止了迭代就会报错print('[gererator]yield执行后')def main():res = gererator()#获取生成器对象print(res)#<generator object gererator at 0x0000018503A15930>print(next(res))#运行生成器函数,打印返回的数据if __name__ == '__main__':main()
'''
<generator object gererator at 0x0000016197635930>
[gererator]yield执行前
iterm = 1'''# #错误的示例
def gererator():#由于yield的存在,使得这个函数是一个生成器print('[gererator]yield执行前')yield 'iterm = 1'#执行到这行代码后,会将值返回,并且暂停在此,等待下一次next或者send函数的调用,再次从这里继续运行,注意最后一定需要将结果返回,否则会报错StopIteration,因为生成器本身就是一个迭代,停止了迭代就会报错print('[gererator]yield执行后')def main():res = gererator()#获取生成器对象print(res)#<generator object gererator at 0x0000018503A15930>print(next(res))#运行生成器函数,打印返回的数据print(next(res))#再次打印,会报错,因为上面一行代码已经将yield运行结束了,所以会使得这行再次运行时,没有返回,导致停止迭代,出错print('*****************')if __name__ == '__main__':main()'''从运行的结果可以看出,两次使用next函数,第一次运行函数,遇到yield停止,第二次继续在yield处开始运行,但是因为没有返回,所以代码停在了生成器中,即停止了迭代,进而在main函数中的 print('*****************')代码也没有执行就直接报错了<generator object gererator at 0x0000019059B95480>
Traceback (most recent call last):
[gererator]yield执行前File "C:/Users/jinlin/Desktop/python_further_study/基础回顾(生成器、迭代器等)/生成器(yield).py", line 39, in <module>
iterm = 1main()
[gererator]yield执行后File "C:/Users/jinlin/Desktop/python_further_study/基础回顾(生成器、迭代器等)/生成器(yield).py", line 35, in mainprint(next(res))#再次打印,会报错,因为上面一行代码已经将yield运行结束了,所以会使得这行再次运行时,没有返回,导致停止迭代,出错
StopIteration
'''# 错误的示例修正+send函数使用,send函数可以向生成器中发送数据,由yield接收
def gererator():#由于yield的存在,使得这个函数是一个生成器print('[gererator]yield执行前')res = yield 'iterm = 1'#执行到这行代码后,会将值返回,并且暂停在此,等待下一次next或者send函数的调用,再次从这里继续运行,注意最后一定需要将结果返回,否则会报错StopIteration,因为生成器本身就是一个迭代,停止了迭代就会报错print('[gererator]yield执行后')print('[generetor]%s'%res)yielddef main():res = gererator()#获取生成器对象print(res)#<generator object gererator at 0x0000018503A15930>print(next(res))#运行生成器函数,打印返回的数据res.send("【main】这是由send发送给生成器的数据")print('*****************')if __name__ == '__main__':main()'''
<generator object gererator at 0x0000021F62065480>
[gererator]yield执行前
iterm = 1
[gererator]yield执行后
[generetor]【main】这是由send发送给生成器的数据
*****************
'''import time
#指定迭代的最大次数,可以减少内存的占用
def gererator(maxnum):#由于yield的存在,使得这个函数是一个生成器for i in range(1,maxnum):print('************start*****************')yield ('迭代数据%s'%i)print('************end*****************\n\n')time.sleep(0.5)def main():for i in gererator(50):print(i)if __name__ == '__main__':main()
'''
************start*****************
迭代数据1
************end*****************************start*****************
迭代数据2
************end*****************************start*****************
迭代数据3
************end*****************************start*****************
迭代数据4
************end*****************************start*****************
迭代数据5
************end*****************************start*****************
迭代数据6
************end*****************************start*****************
迭代数据7
************end*****************************start*****************
迭代数据8
************end*****************************start*****************
迭代数据9
************end*****************************start*****************
迭代数据10
************end*****************
'''
2.yield from itermable:通过可迭代对象来构造生成器,可迭代对象一般有:列表、元组、生成器等
def iterator(n=101):#迭代器,生成一个列表,作为可迭代的对象a = []for i in range(1,n):a.append(i)return adef generator():#生成器,根据列表这个可迭代对象来创建生成器a_list = iterator()yield from a_listdef main():#从生成器中打印出数据for i in generator():print(i,end='、')if __name__ == '__main__':main()