生成器的本质就是迭代器
生成器包括俩种:生成器函数和生成器表达式
生成器函数:
一个包含yield关键字的函数就是一个生成器函数,并且yield不能喝return共用,并且yield只能用在函数内。
1.生成器函数执行之后会得到一个是生成器作为返回值,并且不会执行函数体。
2。执行了_next_()方法之后才会执行函数体,并且获得返回值
3.next()内置方法,内部调用生成器函数的_next_()方法。
4.yield和return相同的是可以返回值,但是不同的是yield不会结束函数。
def generator():
print('sssss')
yield
print('wwwww')
yield
g=generator()#返回一个生成器对象
print(g)
g.__next__()#调用_next_()方法执行函数体,遇到yield停止
g.__next__()
next(generator())
next(generator())
def generator():
print('ssss')
yield 1
print('rrrrrr')
yield 2
g=generator()
g=g.__next__()
print(g)
next(g)
next(generator())
创建生成器
def ksf():
for i in range(1,200000000):
yield '你的存款余额是{}元'.format(i)
g=ksf()
print(next(g))
for fbm in g:
print(fbm)
send()
send 获取下一个值得效果和next()基本一致,只是在获取下一个值的时候,给上一个yield的位置传一个值
def generator():
print('aaa')
content=yield 1
print(content)
print('b')
yield 2
g=generator()
ret=next(g)
print(ret)
g.send('hello')
计算移动平均值:
def fun_avg():
count=1
avg=0
total=0
while True:
get_num=yield avg
total +=get_num
avg=total/count
count +=1
g=fun_avg()
print(next(g))
print(g.send(10))
print(g.send(20))
print(g.send(30))
yield from 循环遍历容器类型 利用for循环取出g1 生成器中的所有值
def g1():
for i in range(3):
yield i
for j in 'ab':
yield j
g=g1()
for gg in g :
print(gg)
使用 yield form 遍历
def g1():
yield from range(3)
yield from 'ab'
g=g1()
print(next(g))
for i in g:
print(i)
生成器表达式 格式:将列表推导式[] 改成 () 即可
利用生成器表达
lst =[i for i in range(10)]
#print(lst)
生成器作用 可以实现多任务(协程–>模拟并发)
g=(i for i in range(10))
print(g)
print(next(g))
for i in g :
print(i)
def demo ():
for i in range(4):
yield i
g=demo()
list()#函数底层会默认调用g的——next——()方法
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
五、生成器作用
可以实现多任务(协程–>模拟并发)