生成器 生成器函式
阿新 • • 發佈:2018-12-11
本質就是迭代器.
一個一個的建立物件
建立生成器的方式:
1. 生成器函式
2. 通過生成器表示式來獲取生成器
3. 型別轉換(看不到)
生成器函式 (重點)
生成器函式中包含 yield , 返回資料和return差不多.
return會立即結束這個函式的執行
yield 可以分段的執行一個函式
生成器函式在執行的時候返回生成器. 而不是直接執行此函式
能向下執行的兩個條件:
__next__(), 執行到下一個yield
send(), 執行到下一個yield, 給上一個yield位置傳值
所有的生成器都是迭代器都可以直接使用for迴圈
都可以使用list()函式來獲取到生成器內所有的資料
生成器中記錄的是程式碼而不是函式的執行
def func():
print("我的天哪 ")
yield "寶寶"
gen = func() # 建立生成器. 此時執行會把生成器函式中的程式碼記錄在記憶體
當執行到__next__(), 執行此空間中的程式碼, 執行到yield結束.
優點: 節省記憶體, 生成器本身就是程式碼. 幾乎不佔用記憶體
特點: 惰性機制, 只能向前. 不能反覆
# def func(): # print("我叫周潤發") # return "林志玲" # return在函式中表示返回的意思 # # # ret = func() # print("返回值是", ret) # 函式中包含了yield, 此函式就是生成器函式 # 大坑: 生成器函式執行之後. 產生一個生成器. 而不是執行函式 # def func(): # print("我叫周潤發") # yield "林志玲" # yield表示返回. 不會終止函式的執行 # print("寶寶幹嘛去了??") # yield "寶寶回來了" # print("寶寶你在幹嘛?") # # yield "沒了" # # ret = func() # 執行函式, 此時沒有執行函式. # # # 此時我們拿到的是生成器 # # print("返回值是", ret) # <generator生成器 object func at 0x0000000009E573B8> # # # 執行到下一個yield # print(ret.__next__()) # 第一次執行__next__此時函式才開始執行 # print(ret.__next__()) # 執行到下一個yield # print(ret.__next__()) # StopIteration # 買衣服, JACK JONES 10000 # def buy(): # lst = [] # for i in range(10000): # lst.append("衣服%s" % i) # return lst # # lst = buy() # print(lst) # def buy(): # for i in range(10000): # yield "衣服%s" % i # # gen = buy() # 生成器或者迭代器的好處: 節省記憶體 # # print(gen.__next__()) # # print(gen.__next__()) # # print(gen.__next__()) # # # for yifu in gen: 迭代器. __next__() # # print(yifu) # # lst = list(gen) # 內部使用的是for迴圈 -> __next__() # print(lst) # send() -> __next__() # send()可以給上一個yield位置傳值 # def func(): # print("韭菜盒子") # a = yield "韭菜雞蛋" # print("a", a) # b = yield "韭菜西紅柿" # print("b", b) # c = yield "火燒" # print("c", c) # # gen = func() # # print(gen.__next__()) # 第一個位置用send沒有任何意義 # print(gen.send("籃球")) # 給上一個yield位置傳值 # print(gen.send("足球")) # def eat(): # print("我吃什麼啊") # a = yield "饅頭" # print("a=",a) # b = yield "⼤餅" # print("b=",b) # c = yield "⾲菜盒⼦" # print("c=",c) # yield "GAME OVER" # # gen = eat() # 獲取⽣成器 # # ret1 = gen.__next__() # print(ret1) # ret2 = gen.send("胡辣湯") # print(ret2) # ret3 = gen.send("狗糧") # print(ret3) # ret4 = gen.send("貓糧") # print(ret4)