yield python_python yield详解

# -*- 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错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值