Python 生成器例子
获取移动平均值
# 日常例子,奥运会打靶,打一次计算一次平均值 #成立了,但是只能拿到一个值 def average(): sum = 0 count = 0 avg = 0 num = yield sum =+ num count += 1 avg = sum/count yield avg avg_g = average() avg_g.__next__() avg1 = avg_g.send(10) print(avg1)
进阶:多次传值,获取多次传值后的平均值
# 进阶,可无限传值 def average(): sum = 0 count = 0 avg = 0 while True: #num = yield num = yield avg sum += num # 注意+= 和 += 不一样的千万别错了 count += 1 avg = sum/count avg_g = average() avg_g.__next__() avg1 = avg_g.send(10) print(avg1) avg1 = avg_g.send(120) print(avg1) avg1 = avg_g.send(120) print(avg1)
再进阶:带装饰器的生成器:将g.__next__()放到装饰器中
#再进阶 --- 带装饰器的生成器 # 将 g.__next__()放到装饰器内 #因为函数从上倒下执行 def test(func): # func = average def inner(*args,**kwargs): g = func(*args,**kwargs) # g = average() 给g 赋值 产生一个生成器 g.__next__() # 执行__next__()方法 相当于激活生成器average()开始运行,返回了一个 avg return g # 将值g返回 return inner @test # 首先执行 average = test(average)=inner def average(): sum = 0 count = 0 avg = 0 while True: #num = yield num = yield avg sum += num # 注意+= 和 += 不一样的千万别错了 count += 1 avg = sum/count avg_g = average() #接着开始调用函数 这个函数的返回值是 inner,因加括号开始调用函数inner() # 相当于avg_g = g = average() avg1 = avg_g.send(10) # avg1 = 10 print(avg1) avg1 = avg_g.send(120) print(avg1) avg1 = avg_g.send(120) print(avg1)

浙公网安备 33010602011771号