🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[success] # 生成器 ~~~  1.生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器 是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next() 函数和send()函数恢复生成器。 2.生成器使用多少用多少,并且不是一次读取出来所以不会对内存占用过多,还可 以模拟并发效果. ~~~ >[success] # next/send/yield -- 三个搭档 ~~~ 1.将函数中的return换成yield就是⽣生成器 2.使用生成器就给使用迭代器的方法__next__() 或者使用send() ~~~ >[danger] ##### 使用 -- yield 和 _ _next_ _() ~~~ 1.使用yield创建一个生成器,配合__next__()调用 2.for 循环可以直接默认使用__next__() ,比__next__() 好处是不会出现超过实际 报错。 ~~~ ~~~ def func(): print("第一次") yield "第一次的yield" print("第二次") yield "第二次的yield" g = func() print(g.__next__()) print(g.__next__()) ~~~ >[danger] ##### 使用 -- yield 、 _ _next_ _()、send ~~~ 1.__next__() 可以让生成器向下执行一次 2.send() 也可以让生成器向下执行一次, 给上一个yield传一个值, 第一个不能用 send(). 最后一个也不要传值 。 ~~~ ~~~ def func(): print("大碴粥") a = yield "11" print(a) print("狗不理") b = yield "22" print(b) print("大麻花") c = yield "33" print(c) g = func() print(g.__next__()) print(g.send(1)) print(g.send(2)) 打印结果: 大碴粥 11 1 狗不理 22 2 大麻花 33 ~~~ >[danger] ##### 假的异步 ~~~ import time def consumer(name): print('%s准备吃包子了!'% name) while(True): baozi = yield print('包子%s来了,被%s吃了!'%(baozi,name)) def producer(name): c = consumer('a') c2 = consumer('b') c.__next__() c2.__next__() print('老子要吃包子了') for i in range(10): time.sleep(1) print('做了两个包子') c.send(i) c2.send(i) pass #通过send 方法向yield传输值;yield通过send接受值; #也就是生产者向消费者传递物品; #串行中实现异步的过程; producer('producer') 打印结果: a准备吃包子了! b准备吃包子了! 老子要吃包子了 做了两个包子 包子0来了,被a吃了! 包子0来了,被b吃了! 做了两个包子 包子1来了,被a吃了! 包子1来了,被b吃了! 做了两个包子 包子2来了,被a吃了! 包子2来了,被b吃了! 做了两个包子 包子3来了,被a吃了! 包子3来了,被b吃了! ......省略 ~~~