首页 > 编程语言 > 详细

python全栈闯关--14-生成器进阶

时间:2019-10-26 11:01:30      阅读:86      评论:0      收藏:0      [点我收藏+]

1、复习

def generator():
    print(1)
    yield a
    print(2)
    yield b
    print(3)

g = generator()
res = g.__next__()  # 第一个__next__执行到第一个yiled停止, 并返回第一个yiled处的值
print(res)
res = g.__next__()  # 第二个__next__执行到第二个yiled停止, 并返回第二个yiled处的值
print(res)
res = g.__next__()  # 虽然执行了print(‘3‘)操作,但是报错,因为后续没有yiled了,为了避免报错,可以结尾加上yiled
print(res)

2、send

def generator():
    print(1)
    num = yield a  # 此处如果继续执行,使用__next__触发,num将会被复制None。使用send,num将会接收seed的值
    print("seed num:%s" % num)
    print(2)
    yield num * 2
    print(3)
    yield

g = generator()
res = g.__next__()  # 第一个__next__执行到第一个yiled停止, 并返回第一个yiled处的值
print(res)
res = g.send(10)  # 发送值给生成器内部,并返回下一个yiled处的值
print(res)
res = g.__next__()  # 虽然执行了print(‘3‘)操作,但是报错,因为后续没有yiled了,为了避免报错,可以结尾加上yiled
print(res)  # 由于yield没有返回值,返回None

 

  • send的获取下一个值得能力和next一致。
  • send时,传递值给当前send位置的yield,并执行代码带一个yiled处停止
  • 使用send注意事项:
    • 第一次获取生成器的值时,使用next,不能以开始就是用send
    • 最后一个yiled的位置,不能使用send,否则会报错“StopIteration”

3、yield from

yiled from 可以从生成器函数中,依次返回各个值

def func():
    s = abcd
    num = 1234
    yield from s
    yield from num

for i in func():
    print(i)

技术分享图片

 

 

X、练习

# 获取移动平均值
def move_arg():
    sum = 0
    count =0
    avg = 0
    while 1:
        num = yield avg
        sum += num
        count += 1
        avg = sum / count

g = move_arg()
print(g.__next__())
print(g.send(10))
print(g.send(20))
print(g.send(30))
print(g.send(10))

使用装饰器,完善上述代码,是代码,使代码运行更加顺畅

def init(f):
    def warp():
        g = f()  # 调用生成器函数,得到一个生成器
        g.__next__()  # 预激活,执行next
        return g  # 返回激活器
    return warp

@init
def move_arg():
    sum = 0
    count =0
    avg = 0
    while 1:
        num = yield avg
        sum += num
        count += 1
        avg = sum / count


g = move_arg()

 

python全栈闯关--14-生成器进阶

原文:https://www.cnblogs.com/zxw-xxcsl/p/11741755.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!