学习笔记(37):Python实战编程-yield实现生成器
生活随笔
收集整理的這篇文章主要介紹了
学习笔记(37):Python实战编程-yield实现生成器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
立即學習: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()?
總結
以上是生活随笔為你收集整理的学习笔记(37):Python实战编程-yield实现生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: express+vue+mongodb+
- 下一篇: 学习笔记(38):Python实战编程-