Python 生成器例子

获取移动平均值

# 日常例子,奥运会打靶,打一次计算一次平均值

#成立了,但是只能拿到一个值
def average():
    sum = 0
    count = 0
    avg = 0
    num = yield
    sum =+ num
    count += 1
    avg = sum/count
    yield avg

avg_g  = average()
avg_g.__next__()
avg1 = avg_g.send(10)
print(avg1)

进阶:多次传值,获取多次传值后的平均值

# 进阶,可无限传值
def average():
    sum = 0
    count = 0
    avg = 0
    while True:
        #num = yield
        num = yield avg
        sum += num  # 注意+= 和 += 不一样的千万别错了
        count += 1
        avg = sum/count


avg_g  = average()
avg_g.__next__()
avg1 = avg_g.send(10)
print(avg1)
avg1 = avg_g.send(120)
print(avg1)
avg1 = avg_g.send(120)
print(avg1)

再进阶:带装饰器的生成器:将g.__next__()放到装饰器中

#再进阶 --- 带装饰器的生成器
# 将 g.__next__()放到装饰器内
#因为函数从上倒下执行
def test(func):  # func = average
    def inner(*args,**kwargs):
        g = func(*args,**kwargs) # g = average() 给g 赋值 产生一个生成器
        g.__next__()  # 执行__next__()方法 相当于激活生成器average()开始运行,返回了一个 avg
        return g # 将值g返回
    return inner

@test # 首先执行 average = test(average)=inner
def average():
    sum = 0
    count = 0
    avg = 0
    while True:
        #num = yield
        num = yield avg
        sum += num  # 注意+= 和 += 不一样的千万别错了
        count += 1
        avg = sum/count


avg_g  = average()  #接着开始调用函数 这个函数的返回值是 inner,因加括号开始调用函数inner() # 相当于avg_g = g = average()
avg1 = avg_g.send(10)  # avg1 = 10
print(avg1)
avg1 = avg_g.send(120)
print(avg1)
avg1 = avg_g.send(120)
print(avg1)

posted on 2019-02-14 17:23  Jerry-Wang  阅读(656)  评论(0)    收藏  举报