为甚要用生成器?
优点是不占用存存空间,只有调用的时候才生成对应的元素。
但是它只有__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 用了这个词就成了生成器
这个函数保存了执行记录,切换之间可以干别的事,有种像单线程下的多线程,(有叫携程,比线程小的,寄生在线程里面)