全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅谈Python生成器generator之next和send的运行流程(详解)

对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。

然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数,后面再次调用next,依次类推。

下面是一个列子:

 def consumer():
   r = 'here'
   for i in xrange(3):
     yield r
     r = '200 OK'+ str(i)

 c = consumer()
 n1 = c.next()
 n2 = c.next()
 n3 = c.next()

了解了next()如何让包含yield的函数执行后,我们再来看另外一个非常重要的函数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行)后,跳出生成器函数。这个过程中,n1一直没有定义。

下面运行到send(1)时,进入生成器函数,注意这里与调用next的不同。这里是从第4行开始执行,把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 = '200 OK'+str(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: 200 OK1
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK2
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 200 OK3
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 200 OK4
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 200 OK5

以上这篇浅谈Python生成器generator之next和send的运行流程(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# python  # 生成器  # send  # python的列表生成式  # 生成器和generator对象你了解吗  # python生成器generator:深度学习读取batch图片的操作  # Python生成器generator原理及用法解析  # Python迭代器iterator生成器generator使用解析  # Python generator生成器和yield表达式详解  # Python生成器generator用法示例  # python生成器generator用法实例分析  # Python生成器(Generator)详解  # Python浅析生成器generator的使用  # 给大家  # 列子  # 的是  # 是一个  # 第一个  # 一句  # 是从  # 我们可以  # 希望能  # 请使用  # 下一  # 第二个  # 再来  # 非常重要  # 另外一个  # 这篇  # 在一  # 一直没有  # 浅谈  # 则会 


相关文章: 宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  如何在Windows虚拟主机上快速搭建网站?  建站上传速度慢?如何优化加速网站加载效率?  建站之星在线客服如何快速接入解答?  定制建站流程解析:需求评估与SEO优化功能开发指南  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何零基础开发自助建站系统?完整教程解析  如何通过二级域名建站提升品牌影响力?  如何用AWS免费套餐快速搭建高效网站?  如何基于云服务器快速搭建网站及云盘系统?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  高防服务器租用指南:配置选择与快速部署攻略  如何用免费手机建站系统零基础打造专业网站?  如何快速搭建自助建站会员专属系统?  专业网站建设制作报价,网页设计制作要考什么证?  常州企业网站制作公司,全国继续教育网怎么登录?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何高效利用200m空间完成建站?    Android自定义控件实现温度旋转按钮效果  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  如何通过.red域名打造高辨识度品牌网站?  建站之星官网登录失败?如何快速解决?  c# 在ASP.NET Core中管理和取消后台任务  建站主机如何选?高性价比方案全解析  建站之星微信建站一键生成小程序+多端营销系统  ,有什么在线背英语单词效率比较高的网站?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  网站制作的步骤包括,正确网址格式怎么写?  如何确保FTP站点访问权限与数据传输安全?  网站制作新手教程,新手建设一个网站需要注意些什么?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  Java解压缩zip - 解压缩多个文件或文件夹实例  北京企业网站设计制作公司,北京铁路集团官方网站?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  建站之星备案是否影响网站上线时间?  建站之星上传入口如何快速找到?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  做企业网站制作流程,企业网站制作基本流程有哪些?  如何通过虚拟主机快速搭建个人网站?  C#怎么使用委托和事件 C# delegate与event编程方法  如何通过网站建站时间优化SEO与用户体验?  深入理解Android中的xmlns:tools属性  个人摄影网站制作流程,摄影爱好者都去什么网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。