生成器 生成器函数

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

  

猜你喜欢

转载自www.cnblogs.com/YangWenYu-6/p/10105564.html