Python生成器generator之next和send运行流程
2018-02-08 15:15
363 查看
next:
1 def consumer(): 2 r = 'here' 3 for i in xrange(3): 4 yield r 5 r = '200 OK'+ str(i)
6
7 c = consumer() 8 n1 = c.next() 9 n2 = c.next() 10 n3 = c.next()对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数,后面再次调用next,依次类推。
send:
1 def consumer():2 r = 'here'3 while True:4 n1 = yield r5 if not n1:6 return7 print('[CONSUMER] Consuming %s...' % n1)8 r = '200 OK'+str(n1)910 def produce(c):11 aa = c.send(None)12 n = 013 while n < 5:14 n = n + 115 print('[PRODUCER] Producing %s...' % n)16 r1 = c.send(n)17 print('[PRODUCER] Consumer return: %s' % r1)18 c.close()1920 c = consumer()21 produce(c)再来看另外一个非常重要的函数send(msg)。
其实next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,
只能传递None进去。因此,我们可以看做c.next() 和 c.send(None) 作用是一样的。
需要提醒的是,第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错的,
因为没有Python yield语句来接收这个值。
下面来着重说明下send执行的顺序。
当第一次send(None)(对应11行)时,启动生成器,从生成器函数的第一行代码开始执行,直到第一次
执行完yield(对应第4行)后4000,跳出生成器函数。这个过程中,n1一直没有定义。
下面运行到send(1)时,进入生成器函数,注意这里与调用next的不同。
这里是从第4行开始执行,把1赋值给n1,但是并不执行yield部分。
下面继续从yield的下一语句继续执行,然后重新运行到yield语句,执行后,跳出生成器函数。
即send和next相比,只是开始多了一次赋值的动作,其他运行流程是相同的。
相关文章推荐
- Python生成器generator之next和send运行流程
- 浅谈Python生成器generator之next和send的运行流程(详解)
- Python生成器generator之next和send运行流程
- Python生成器generator之next和send的运行流程(详解)
- Python 生成器 generator之next和send运行流程
- Python生成器generator之next和send运行流程
- Python生成器generator之next和send运行流程
- 小白汪:Python学习之generator、Iterator关系及generator的send和next运行流程
- 关于Python生成器(Generator的yield、next、send)
- python3.x中的生成器generator调用next方法
- python3.x中的生成器generator调用next方法
- 生成器+列表生成式,生成器可以节省内存,随时调取函数运行,以及实现多线程运行函数,__next__()和.send(参数)的区别,a,b=b,a+b其实是元祖的用法,出现异常状态用try...except StopIteration来处理
- Python:generator的send()方法流程分析
- Python yield生成器的send方法考察
- python 学习之 generator(生成器)生成杨辉三角
- python中的生成器generator
- Python的生成器(generator)
- [读书笔记]python中的生成器(generator)
- Python yield与send,iter与next
- python yield,生成器,generator