1.生成器函数进阶(一)
1 # 生成器函数进阶 2 3 def generator(): 4 print(123) 5 num = yield 1 # 当第一个__next__发生时,yiled 1先被执行,被返回,停在了这里,之后当send来了后,send的参数先赋值给了yield的左值,之后再执行下一个yield之前的代码 6 # send()获取yield值之前,会给上一个yield的位置传递一个参数数据,这个数据可以被上一个yield的左值接收 7 # 使用生成器的send()方法,就是在触发yield时,会将send传递过去的参数赋值到上一个yield的左值位置,然后在执行上一次yield和本次触发yield之间的代码 8 print('----', num) 9 print(456)10 yield 211 12 g = generator()13 ret = g.__next__()14 print('**', ret)15 # send()调用后,会在获取下一个yield值之前,会给上一个yield的位置传递一个参数数据,这个数据可以被上一个yield的左值接收16 ret = g.send('hello') # ---- hello\n456 和__next__效果类似,只不过多了一个将参数赋值给了上一个yield,可以赋值给上一个yield的左值17 print('**', ret)
2.生成器函数进阶(二)
1 # 获取移动平均值(预激生成器的装饰器的例子:使用装饰器激活生成器) 2 def init(func): 3 def wrapper(*args, **kwargs): 4 g = func(*args, **kwargs) 5 next(g) 6 return g 7 return wrapper 8 9 @init # ==> average = init(average)10 def average():11 sum = 012 count = 013 avg = 014 while True:15 num = yield avg16 sum += num17 count += 118 avg = sum / count19 20 avg_g = average()21 #avg_g.__next__()22 avg1 = avg_g.send(10)23 print(avg1)24 25 26 27 # python3中新加入的生成器函数知识点 yield from28 def generator():29 a = 'abcde'30 b = '12345'31 yield from a # 从一个容器中,一个一个返回其中的元素32 yield from b33 34 g = generator()35 for i in g:36 print(i) # a\nb\nc\nd\nd\ne\n1\n2\n3\n4\n5\n