1.send使用:
def generator(): print("123") num = yield 1 print("---"+num) print("456") yield 2 print("987") g = generator() print(g.__next__()) #next遇到yield停止,后send赋值于num print(g.send("hello"))
结果:
123
1
---hello
456
2
send 获取下一个值的效果和next基本一致
只是在获取下一个值的时候,给上一yield的位置传递一个数据
使用send的注意事项
第一次使用生成器的时候 是用next获取下一个值
最后一个yield不能接受外部的值
#计算移动平均值 def averager(): total = 0.0 count = 0 average = None while True: term = yield average total += term count += 1 average = total/count g_avg = averager() next(g_avg) # print(g_avg.send(10)) print(g_avg.send(30)) print(g_avg.send(5)) # averager total count term # next() None 0 1 None # send(10) 10 10 2 10 # send(30) 30 40 3 20 # send(5) 5 45 4 5
---------------------------------------------------------
def init(func): #在调用被装饰生成器函数的时候首先用next激活生成器 def inner(*args,**kwargs): g = func(*args,**kwargs) next(g) return g return inner @init def averager(): total = 0.0 count = 0 average = None while True: term = yield average total += term count += 1 average = total/count g_avg = averager() # next(g_avg) 在装饰器中执行了next方法 print(g_avg.send(10)) print(g_avg.send(30)) print(g_avg.send(5))