美文网首页
python yield详解

python yield详解

作者: 青哥DevOps | 来源:发表于2019-01-17 00:57 被阅读0次
# -*- coding:utf-8 -*-
from tornado import gen
def h():
    print 'nihao',
    m = yield 2
    print m
    d = yield 12
    print d
    aaa = yield 13
    print 'jieshule!!!'

c = h()
m = c.next()
d = c.send('caiqing')
aaa = c.send('xixi')

print m,d,aaa

nihao caiqing
xixi
2 12 13
  1. 有yield的函数已经成为一个生成器了,并且,直接调用函数是不会执行生成器里面的代码,只有使用next()或者send(),才会被执行生成器里面的函数。
  2. 第一次使用next()的时候,代码会执行到第一个yield(并且获取了yield 返回值 2),也就是本文中的 m = yield 2 ,后面的print m没有被执行,send()也是这样。
  3. send()可以看来,是用来传递第一个参数,也就是将send()里面的内容传递给m ,也就是m = 参数值,所以print m 最后输出的是send(),括号里面的值。以此类推。
    总结,可以理解为,next()和send()其实原理都差不多,都是从当前执行到下一个yield(不包含下一个yield,就算下一个前面有print,但是print 后面没有yield,也不会去执行。)
    不懂得可以看看这个实例:https://www.cnblogs.com/maoxiaolv/p/6425875.html

有些朋友看了以后,后台和我留言,让我把脚本的步骤下来:

# coding:utf-8


def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
            return
        print("consumer :%s" % n)
        r = '200 OK'


def product(c):
    a = c.__next__()
    # print(a)
    i = 0
    while i < 5:
        i += 1
        print("product: %s" % i)
        r = c.send(i)
        print("consumer return :%s" % r)
    c.close()

c = consumer()
product(c)




---- result ----
product: 1
consumer :1
consumer return :200 OK
product: 2
consumer :2
consumer return :200 OK
product: 3
consumer :3
consumer return :200 OK
product: 4
consumer :4
consumer return :200 OK
product: 5
consumer :5
consumer return :200 OK

脚本详解:
# 综合上面可以看出,无论是next()还是send(),都是执行到当前的yield,如果后面有yield,后面的逻辑就执行,如果没有,就不执行了,即使后面是print 也不会执行。
# next()=send(None)
# 上面的脚本执行逻辑为,c.__next__()对应consumer()中的,r = ''; while True:; n = yield r(也就是n = None); 
# 而c.send(i)对应consumer()中的,if not n(也就是if not None):; return;
# n = yield r(也就是n = i); if not n(也就是if not i):; print("consumer :%s" % n); r = '200 OK'

保证每一次的next()/send() 必须只有一个yield,如果后面没有yield,有其他的逻辑,那么使用next()/send(),会报StopIteration错误。


相关文章

  • python中yield的用法

    python中yield的用法详解——最简单,最清晰的解释

  • yeild的用法

    python中yield的用法详解——最简单,最清晰的解释

  • Python yield

    Python yield的用法详解 如何快速的对yield有一个初步的了解,那么首先我们可以先将yield看做是r...

  • python的生成器是怎么回事

    Python基础 - yield 用法详解 转载:http://www.pythontab.com/html/20...

  • Python3中asyncio异步详解一

    在学习asyncio相关的知识前,如果有同学没有读到Python3中yield与yield from详解[http...

  • python yield详解

    有yield的函数已经成为一个生成器了,并且,直接调用函数是不会执行生成器里面的代码,只有使用next()或者se...

  • python中yield的用法详解(转)

    原链接:python中yield的用法详解——最简单,最清晰的解释首先,如果你还没有对yield有个初步分认识,那...

  • 31.python中的yield

    python中yield的用法详解——最简单,最清晰的解释 首先,如果你还没有对yield有个初步分认识,那么你先...

  • yield

    原文:python中yield的用法详解——最简单,最清晰的解释_mieleizhi0522的博客-CSDN博客 ...

  • Python之yield详解

网友评论

      本文标题:python yield详解

      本文链接:https://www.haomeiwen.com/subject/mthbdqtx.html