python 19day--生成器详解

一、生成器的概念:

只要函数内部包含有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)])

列表推导式 相对于生成器表达式要浪费内存

 

原文地址:https://www.cnblogs.com/yuzhiboyou/p/10153774.html