1. 程式人生 > >生成器 生成器函式

生成器 生成器函式

本質就是迭代器.
一個一個的建立物件
建立生成器的方式:
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)