想想已经不知道是什么时候开始接触到学的代码里面出现yield这个东西了。上网查一查,理解解散千千万,一个比一个绕,
廖雪峰大佬的斐波那契数列啥的,(我连数列都没办法迅速联想起来),还有什么消费者,生成者,迭代器,各种解释一个问题,需要让我去查一万个新问题的解答。
现在记录下我的笨蛋理解了。
先看一段yield代码。
# *_*coding:utf-8 *_*
def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK'
def produce(c):
c.send(None)
n = 0
# 1,2,3,4,5
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()
c = consumer()
produce(c)
(此处剽窃一波大佬的讲解代码。忘了是谁的了,尴尬)
此处理解难点有两个,
1: n = yield r
2:r = c.send(n)
这边先说下,稍微查过下的都知道,yield可以初略理解成return。也就是返回信息,只不过是断断续续的返回。
那么这里的n = yield r 根据代码的从右向左读,运行到yield r的时候就结束了。然后返回后继续运行后续代码,也就是到了while循环处,r = c.send(n)
此处的n被赋值1,
然后进入到了c函数consumer函数中,拼接一下,也就是从 n = 1开始从继续运行。
这个代码其实是一个很典型的很好的例子了。
“”“=====================================================================================”“”
现在我们来再解析下这个代码的运行流程,
1:p = c.send(None)
此处传空,只是单独运行了下consumer函数,到 yield r处截止,也就是如果此处有返回,那就是返回的r = ' '
2: while的第一次循环,n == 1的情况下,r = c.send(n)
此处的send操作相当于,consumer函数中的n = yield r, 将yield r,替换成send进来的n,也就是n = n == 1
3:走完了上一步后,获得了r = “200 OK”,然后继续他未完成的while循环,也就是又走到了,n = yield r这里,然后更具一开始说的,yield r先运行,也就是return了一个r = "200 OK"出去,被外面的r = c.send(n)中的r接收到了。然后外面的继续他的循环,更改n的值再传到里面去,
“”“======================================================================================”“”
以上基本就是yield中,send,和yield r 的含义了。和该例子的理解了。
其实说白了想明白几点就可以了,
首先,代码运行到yield中断,
其次,传出数据用的是yield r,进来数据也是从yield r这里
最后,将yield r想象成一个断点。
此处感谢一波大佬的(https://www.cnblogs.com/chameleon-/p/9380405.html)最最最重要的一环解释
(此处理解,解释均为非官方,能将就着理解系列,如果有验证逻辑错误,请不吝指出)