关于python中生成器之Send方法

#send主要是用于外部与生成器对象的交互
def
func1(): # 生成器函数 print("ok1") x = 10 # 函数内局部变量x赋值为10 print(x) x = yield 1 # 这里就是send函数的关键 # 之前我们创建的生成器,yield左边都是没有值(我现在不是很确定这里是不是应该叫做返回值,那就先用值代替)。 # 现在我们的x会接收到一个值,这个值是什么,从哪里来的?我们继续看下去 print(x) yield x # 这里试第二个断点 f1 = func1() # 获取生成器对象 ret1 = next(f1) # 运行到第一个yield # ret1 = f1.send(None) #(这一句语句需要全部看完回头再看)当第一次执行生成器的时候,他并没有执行到yield这个位置,所以你一点传值,就会出现问题 # 谁去接收?没有对象接收就会报错,所以第一次如果一定要用send去调用,那就传一个None print(ret1) # 打印第一个yield返回的值 ######################################### # 关键点来了 # 我们现在有两个问题,x = yield 1,这个x的值是什么,从哪里来 # 当下面这条语句运行后,他会将x的值赋值为send方法的参数,并且继续执行到下一个yield ret2 = f1.send('eee') print(ret2) # ok1 # 10 # 1 # eee # eee # 问题都解决了,然后还有一个顺序的问题,测试的结论提出来,可以自己打断点尝试一下 # f=func1() # next(f)或者f.send(None) => def func1(): # ...... # x = yield 1 到这里会返回,x的值不变 => f1.send('eee') # =>x = yield 1 这时候不要去管右边,左边的x被赋值('eee')然后继续执行 # 其实只要把yield的左边和右边分开看就行了,他们的触发条件不一样。

 

posted @ 2018-06-05 09:02  小L小  阅读(4448)  评论(0编辑  收藏  举报