python·生成器

生成器的本质就是迭代器
生成器包括俩种:生成器函数和生成器表达式

生成器函数:
一个包含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__())

五、生成器作用

可以实现多任务(协程–>模拟并发)

猜你喜欢

转载自blog.csdn.net/weixin_44239431/article/details/86531807