一、定义:只要含有yield关键字的函数都是生成器函数,yield不能和return共用且需要写在函数内
二、特点:生成器函数执行之后会得到一个生成器作为返回值,yield不会结束程序
三、创建生成器的两种方式:
1、生成器推导式
generator = (x*2 for x in range(10)) #这里的generator就是一个生成器
注意:和列表推导式的区别
1、和列表推导式的区别是括号不一样,列表推导式使用的是中括号 s=[x for x in range(10)]
2、返回的值不一样,列表推导式返回一个列表,生成器推导式返回一个生成器
3、比列表推导式节省内存空间
2、生成器函数
def generator()
yield
generator() 这里的generator()就是一个生成器
四、生成器函数
含有yield关键字, 可以看成是函数中的return
send方法 生成器send方法,可以传值给yield,最终将传进的值进行返回
注意:注意:生成器没有next方法的时候,第一次传值只能为send(None)
生成器函数的特点:
调用之后函数内的代码不执行,返回生成器
每从生成器中取一个值就会执行一段代码,遇见yield就停止
如何从生成器中取值:
for :如果没有break就会一直取直到取完
next: 每次只取一个值
send不能用在第一个,取下一个值得时候给上个位置传一个新的值,可以使用预激活的方式,next可以放在装饰器中 参照第二个实例
数据类型强制转换:会一次性把所有的数据都读到内存中
五、实例:
def average(): sum = 0 count = 0 avg = 0 while True: num = yield avg sum += num count += 1 avg = sum/count avg_g = average() avg_g.__next__() avg1 = avg_g.send(10) avg1 = avg_g.send(20) print(avg1)
def init(func): def inner(*args,**kwargs): g = func(*args,**kwargs) next(g) return g return inner @init def aver(): sum = 0 count = 0 avg = 0 while True: num = yield avg sum += num count += 1 avg = sum/count aver_g = aver() ave = aver_g.send(10) print(ave) ave = aver_g.send(50) print(ave)