最近因为看见公司一位大神将yield用的出神入化,极为赞叹,遂研究了一下他的代码,总结出以下yield使用方法,希望大家加以指正。
都知道yield是python生成器,他可以将数据一个一个的“生”出来而不是将所有数据存储到内存中,从而造成大量内存的占用,这个是yield使用最常见的一种方式,这种方式大概是使用for循环中嵌套yield语句来实现的。
如下:
for i in range(x):
# do something in there
yield i
yield还有一种使用方式就是异步,主要的应用有tornado中的@coroutine 如果想要进行异步之间的通信,就可以使用generation.send() 来进行交流
def yield_test():
page = 1
while 1:
try:
# something else
last_space = yield page
print last_space
except StopIteration:
break
last_space = None
generator = yield_test()
current_page = generator.send(last_space)
print current_page
last_space = 1
for i in range(x):
current_page = generator.send(last_space)
print current_page
current_space += 1
生成器在创建的时候,首先在创建生成器的时候,生成器中的代码并不执行,在send()方法执行之后才开始执行,并且这时执行完yield就停止了,就是将生成器中的值传给外边,然后生成器内部就处于停止状态,等待外边再次传入值。(注意,第一次传入的None并没有将数据赋值)第二次send的值才首次赋值,并且循环一次,将值yield出来之后生成器内部停止。
暂时就这样,想到什么再补充