python yield详解

2019-01-17  本文已影响0人  青哥DevOps
# -*- 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错误。


上一篇 下一篇

猜你喜欢

热点阅读