一、生成器的概念:
只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码
1 def func(): 2 print('====>first') 3 yield 1 4 print('====>second') 5 yield 2 6 print('====>third') 7 yield 3 8 print('====>end') 9 10 g=func() 11 print(g)
print 的结果为 <generator object func at 0x019EF720> 函数的内存地址
二、生成器就是迭代器:
因为生成器有下面连个方法
g.__next__()
g.__iter__()
因此生成器可以这样写
next(g)
三、协程函数(生产者消费者模型):
1 #yield关键字的另外一种使用形式:表达式形式的yield 2 def eater(name): 3 print('%s 准备开始吃饭啦' %name) 4 food_list=[] 5 while True: 6 food=yield food_list 7 print('%s 吃了 %s' % (name,food)) 8 food_list.append(food) 9 10 g=eater('egon') 11 g.send(None) #对于表达式形式的yield,在使用时,第一次必须传None,g.send(None)等同于next(g) 12 g.send('蒸羊羔') 13 g.send('蒸鹿茸') 14 g.send('蒸熊掌') 15 g.send('烧素鸭') 16 g.close() 17 g.send('烧素鹅') 18 g.send('烧鹿尾')
四、yield总结:
生成器运行一次就是保存一次的状态,全部运行完以后就死了
yield实现的功能是
把函数做成生成器
与return的区别:可以返回多次值,可以保存函数状态
五、生成器表达式:
res = sum(i for i in range(100))
生成式表达式的优点是节省内存
六、列表推导式:
res = sum([i for i in range(10000000)])
列表推导式 相对于生成器表达式要浪费内存