1 #生成器--->本质是迭代器 2 3 #生成器函数:只要含有yield关键字的函数就是生成器函数 4 5 #yield不能和return共用 且只能用在函数里 6 7 #生成器函数执行之后得到一个生成器作为返回值 8 9 10 def generator(): 11 print(123) 12 content = yield 1 13 print(‘=========‘,content) 14 print(456) 15 yield 2 16 17 g = generator() 18 19 ret = g.__next__() 20 21 print(‘***‘,ret) 22 ret = g.send(‘hello‘) 23 print(‘***‘,ret) 24 25 #next 和 send的用法 26 #send获取下一个值的效果和next基本一致 27 #只是在获取下一个值的时候给上一个值传递一个数据 28 #send注意事项 29 #生成器函数必须使用next获取第一个值 30 #最后一个yield不能获取外部的值 31 32 33 #******************************案例 获取移动平均值******************************** 34 35 def average(): 36 sum_m = 0 37 count = 0 38 avg = 0 39 while True: 40 num = yield avg 41 sum_m += num 42 count += 1 43 avg = sum_m/count 44 45 46 avg_g = average() 47 avg_g.__next__() 48 avg1 = avg_g.send(10) 49 avg1 = avg_g.send(30) 50 avg1 = avg_g.send(50) 51 print(avg1) 52 53 #******************************案例 带装饰器的生成器******************************* 54 def init(func): 55 def inner(*args,**kwargs): 56 g = func(*args,**kwargs) 57 g.__next__() 58 return g 59 return inner 60 @init 61 def average(): 62 sum_m = 0 63 count = 0 64 avg = 0 65 while True: 66 num = yield avg 67 sum_m += num 68 count += 1 69 avg = sum_m/count 70 71 avg_g = average() 72 avg1 = avg_g.send(10) 73 74 #*********************************生成器 yield from***************************** 75 76 def generator(): 77 a = ‘abcdefg‘ 78 b = ‘1234567‘ 79 yield from a 80 yield from b 81 82 g = generator() 83 84 for i in g: 85 print(i) 86 87 #*********************************生成器表达式********************************** 88 g = (i for i in range(10)) 89 #g 是得到的生成器
原文:https://www.cnblogs.com/zhengyinboke/p/11868864.html