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))