《慶餘年》手遊戰鬥視訊 打造暢爽戰鬥體驗
阿新 • • 發佈:2022-03-26
生成器概念
生成器物件其實就是自定義的迭代器,其本質上是迭代器,也就是說生成器就是一個可以進行迭代生成的工具
生成器物件
函式體程式碼內含有yield關鍵字的時候,第一次呼叫函式的時候不會執行函式體程式碼,而是會返回一個結果,該結果就是生成器。也就是第一次呼叫函式會將函式變成生成器。生成器物件內部含有__iter__
和__next__
方法
def index(): yield 123 yield 666 res = index() # 呼叫不執行函式體程式碼,將函式變成生成器物件 print(res) # <generator object index at 0x00000204B99BFEB8> print(res.__next__()) # 123 # 然後對執行後的結果呼叫__next__方法執行程式碼 print(res.__next__()) # 666 print(res.__next__()) # 報錯 執行完再執行會報錯
yield關鍵字
- yield 關鍵字的功能
- 函式體程式碼內含有yield時,會將函式變成生成器
- 多個yield關鍵字存在函式體程式碼內時,呼叫__next__執行到yield關鍵字的時候會將yield關鍵字後面的資料返回出去,並將程式碼停留在這一步。再次執行__next__時是從暫停的這一步繼續進行執行的。執行到程式碼結束,也會報錯。
- 接受外界的傳值
def h(name): while True: game = yield print(f'{name} is paling {game}') res = h('oliver') res.__next__() # 先初始化一次,等待給yield傳值 res.send('piano') # 接受外界傳值給yield 結果:oliver is paling piano res.send('pingpang') # 接受外界傳值給yield 結果:oliver is paling pingpang
生成器表示式
res = (i for i in 'oliver')
print(res)
print(res.__next__()) # o
print(res.__next__()) # l
print(res.__next__()) # i
print(res.__next__()) # v
print(res.__next__()) # e
print(res.__next__()) # r
print(res.__next__()) # 報錯