python 生成器中的send、移动平均值、列表表达式相关

1.send

  def generato():
        print('关于send的使用方法')
        tmp = yield 1
        print('上面的就是send的应用')
        print(tmp)
        yield '现在来测试一下效果吧'
    
    g = generato()
    g.__next__()
    g.send('我们一起学python')
    
    #send 获取下一个值的效果和next基本一致
    #只是在获取下一个值的时候,给上一yield的位置传递一个数据
    #使用send的注意事项
        # 第一次使用生成器的时候 是用next获取下一个值
        # 最后一个yield不能接受外部的值

2.生成器计算移动平均值

def averager():
    total = 0.0
    count = 0
    average = None
    while True:
        term = yield average
        total += term
        count += 1
        average = total/count
g_avg = averager()
print(g_avg.__next__())
print(g_avg.send(10))
print(g_avg.send(30))

升级版

def init(func):
    def inner(*args,**kwargs):
        g = func(*args, **kwargs)
        g.__next__()
        return g
    return inner


@init
def averager():
    total = 0
    count = 0
    average = None
    while True:
        term = yield average
        total += term
        count += 1
        average = total/count
g_avg = averager()
print(g_avg.send(10))
print(g_avg.send(30))

生成器列表嵌套习题:

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g = test()
for n in [1,10,5]:
    g = (add(n,i) for i in g)

    
    print(list(g))

PS:遇到问题没人解答?需要Python学习资料?可以加点击下方链接自行获取
note.youdao.com/noteshare?id=2dce86d0c2588ae7c0a88bee34324d76

生成器的列表嵌套式一定要拆分写!!注意只有在yield额时候生成数据,在for循环中
生成过两次g,不可以按照顺序执行下去,因为n=10时候的g是不可以赋值给n=5时候的g的,
所以一定要拆分开来计算!

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g = test()
for n in [1,10,5]:
    g = (add(5,i) for i in add(5,i) for i in add(5,i) for i in [0,1,2,3])  #按照解析的计算即可


print(list(g))

你可能感兴趣的:(python 生成器中的send、移动平均值、列表表达式相关)