生成器是一個自定義的迭代器,本質上是一個迭代器,內置有.__ iter__ () 和. __ next__()python
相同點:返回值的個數都是無限制的函數
不一樣點:return只能返回一次,函數便終止執行後續代碼,yield能夠屢次使用,讓函數執行暫停,下次調用從上次暫停位置繼續執行,直到從新遇到yield再次被暫停code
def func(): print("函數體代碼") yield yield 2 yield 3, 4, '5', '6' # yield返回多個值也是默認返回成元組,可修改爲其餘的類型返回出去 yield ['7', 8, 9] # 正常執行不會執行函數體代碼 # res是一個迭代器,若是不賦值給res會重複執行第一個yield res = func() # 當咱們經過__next__取值時,纔會執行函數體代碼。 # res.__next__() # 執行函數體代碼,獲得返回值none但沒打印返回值,因此沒有 print(res.__next__()) # yield能夠保存函數的暫停狀態,下次在上次基礎上執行直到遇到下次yield print(res.__next__()) print(res.__next__()) # print(res.__next__()) # StopIteration報錯 >>> 函數體代碼 None 2 (3, 4, '5', '6') # next(迭代器對象)至關於迭代器對象.__next__() next(res) # 執行函數體代碼,獲得返回值none但沒打印返回值,因此沒有 print(next(res)) print(next(res)) print(next(res)) >>> 函數體代碼 2 (3, 4, '5', '6') ['7', 8, 9] # 若是不報錯想自動執行 while True: try: print(next(res)) except StopIteration: break
自定義range,實現range功能對象
def my_range(start,end,move=1): while start < end: yield start start += move for i in my_range(1,5): print(i) >>> 1 2 3 4 for i in my_range(1,6,2): print(i) >>> 1 3 5