def chicken(): print('=====>first') yield 1 print('=====>sencond') yield 2 print('=====>third') yield 3 obj=chicken() print(obj) # <generator object chicken at 0x000002CEE1A7AAC8> 是一個生成器, 一隻老母雞
print(obj.__iter__() is obj) # True print(next(obj)) # =====>first 1 print(next(obj)) # =====>sencond 2 print(next(obj)) # =====>third 3
for item in obj: print(item) ''' =====>first 1 =====>sencond 2 =====>third 3 ''' ------------------------------------------------------------ 🍔一、"iter_obj=obj.__iter__()" 拿到迭代器 🍔二、觸發 "iter_obj.__next__()" 拿到該方法的返回值,賦值給item 🍔三、周而復始,直到函數內不在有 "yield", 即取值完畢 🍔四、"for" 會檢測到 "StopIteration" 異常,結束循環
def my_range(): n = 0 while True: yield n n += 1 obj = my_range() # 一個生成器 print(obj) # <generator object my_range at 0x0000022784809F48>輸出的是老母雞內存地址 🍔使用"next"取值 print(next(obj)) # 0 print(next(obj)) # 1 print(next(obj)) # 2 print(next(obj)) # 3 ......等等.. 🍔使用 "for" 循環 for i in my_range(): # 也能夠使用 for 循環取 print(i)
def my_range(start, stop, step = 1): n = start while n < stop: yield n n += step 🍔使用 "next" 取值 obj = my_range(2 ,14, 2) print(next(obj)) # 2 print(next(obj)) # 4 print(next(obj)) # 6 🍔使用 "for" 循環 for line in my_range(2, 15, 3) print(line)
next
: 執行一次python
send
: send 會傳送一個值給 yield 關鍵字, 賦值給 yield 左邊的的變量名, 再執行等同於 next 的功能繼續執行下面的代碼函數
close
: 當使用 close 時, 會關閉生成器, 沒法在進行迭代取值, 取值則報 StopIteration 異常code
喂狗示例: ps : "dog.send(None)" 的效果等於 "next(dog)"協程
def eat(name): print('%s start eat' %name) while True: food = yield 1 # yield 接收 send 傳過來的值賦值給 food print('%s start eat %s'%(name,food)) dog = eat('派大星的狗') # 得到生成器 next(dog) # 派大星的狗 start eat dog.send("海綿寶寶") # 派大星的狗 start eat 海綿寶寶 (send 自帶 next 的執行功能) dog.close() # 關閉這個生產器 (沒法在進行取值) next(dog) # 再次取值跑出異常 "StopIteration"