生成器函数
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)