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

Python 生成器函式

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)