立即學習: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()
?