Python 生成器函式
阿新 • • 發佈:2018-12-11
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)