Python 生成器函数

时间:2020-12-06 16:44:00
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)