日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

学习笔记(37):Python实战编程-yield实现生成器

發布時間:2023/12/10 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习笔记(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实现生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。