生成器函数

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)

  

posted @ 2018-12-11 14:59  =-=-  阅读(137)  评论(0编辑  收藏  举报