# -*- 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
- 有yield的函数已经成为一个生成器了,并且,直接调用函数是不会执行生成器里面的代码,只有使用next()或者send(),才会被执行生成器里面的函数。
- 第一次使用next()的时候,代码会执行到第一个yield(并且获取了yield 返回值 2),也就是本文中的 m = yield 2 ,后面的print m没有被执行,send()也是这样。
- 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错误。
网友评论