为甚要用生成器?
优点是不占用存存空间,只有调用的时候才生成对应的元素。
但是它只有__next__() 方法调用,只记录当前的位置。
先看下列表生成式
i*2 也可以是调用一个函数
list = [ i*2 for i in range(10)]print(i)
生成器的写法
list = ( i *2 for i in range(10))
f = __next__()
print(f)
__next__()
只能一个一个调用
一个重要的方法是send()
它既可以传参数又可以调用__next__()
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("做了2个包子!")
c.send(i)
c2.send(i)
producer("alex")
yield 用了这个词就成了生成器
这个函数保存了执行记录,切换之间可以干别的事,有种像单线程下的多线程,(有叫携程,比线程小的,寄生在线程里面)