本质就是迭代器.
一个一个的创建对象
创建生成器的方式:
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)