怎么使用python生成器中的send()和next()-创新互联
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
成都创新互联公司是一家专注于网站制作、成都做网站与策划设计,莱西网站建设哪家好?成都创新互联公司做网站,专注于网站建设10年,网设计领域的专业建站公司;建站业务涵盖:莱西等地区。莱西做网站价格咨询:18980820575这篇文章将为大家详细讲解有关怎么使用python生成器中的send()和next(),文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
在异步IO的使用时,generator是最基本的一个实现方法。python生成器有两个主要方法,一个是send一个是next。今天我们来看看两者的用法和联系。在每段代码中,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数后面再次调用next,依次类推。
这里我们用经典的生产者-消费者模型举个例子(摘自廖雪峰的博客)
def consumer(): r = 0 for i in xrange(3): yield r r = '200 OK'+ str(i) c = consumer() n1 = c.next() n2 = c.next() n3 = c.next()
实际上next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去。因此,我们可以看做c.next() 和 c.send(None) 作用是一样的。
第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错的,因为没有Python yield语句来接收这个值。
下面说明下send执行的顺序。先记住,n1 = yield r这句话是从右往左执行的。当第一次send(None)(对应11行)时,启动生成器,从生成器函数的第一行代码开始执行,直到第一次执行完yield(对应第4行)后,跳出生成器函数。这个过程中,n1一直没有定义。
运行到send(1)时,进入生成器函数,此时,将yield r看做一个整体,赋值给它并且传回。此时即相当于把1赋值给n1,但是并不执行yield部分。下面继续从yield的下一语句继续执行,然后重新运行到yield语句,执行后,跳出生成器函数。即send和next相比,只是开始多了一次赋值的动作,其他运行流程是相同的。
def consumer(): r = 'here' while True: n1 = yield r #这里的等式右边相当于一个整体,接受回传值 if not n1: return print('[CONSUMER] Consuming %s...' % n1) r = '%d00 OK' % n1 def produce(c): aa = c.send(None) n = 0 while n < 5: n = n + 1 print('[PRODUCER] Producing %s...' % n) r1 = c.send(n) print('[PRODUCER] Consumer return: %s' % r1) c.close() c = consumer() produce(c)
运行结果:
[PRODUCER] Producing 1... [CONSUMER] Consuming 1... [PRODUCER] Consumer return: 100 OK [PRODUCER] Producing 2... [CONSUMER] Consuming 2... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 3... [CONSUMER] Consuming 3... [PRODUCER] Consumer return: 300 OK [PRODUCER] Producing 4... [CONSUMER] Consuming 4... [PRODUCER] Consumer return: 400 OK [PRODUCER] Producing 5... [CONSUMER] Consuming 5... [PRODUCER] Consumer return: 500 OK
关于怎么使用python生成器中的send()和next()就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
网站栏目:怎么使用python生成器中的send()和next()-创新互联
本文来源:http://scyanting.com/article/dhjhpo.html