美文网首页
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详解

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