python中的yield的理解,含义

想想已经不知道是什么时候开始接触到学的代码里面出现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)最最最重要的一环解释

(此处理解,解释均为非官方,能将就着理解系列,如果有验证逻辑错误,请不吝指出)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值