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.生成器计算移动平均值

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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))

生成器列表嵌套习题:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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))

生成器的列表嵌套式一定要拆分写!!注意只有在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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值