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

发布时间 - 2026-01-11 01:00:56    点击率:

对于普通的生成器,第一个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的使用  # 给大家  # 列子  # 的是  # 是一个  # 第一个  # 一句  # 是从  # 我们可以  # 希望能  # 请使用  # 下一  # 第二个  # 再来  # 非常重要  # 另外一个  # 这篇  # 在一  # 一直没有  # 浅谈  # 则会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  Java遍历集合的三种方式  高防服务器租用首荐平台,企业级优惠套餐快速部署  iOS验证手机号的正则表达式  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  Laravel如何实现文件上传和存储?(本地与S3配置)  ,网页ppt怎么弄成自己的ppt?  怎么用AI帮你为初创公司进行市场定位分析?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  微信小程序 scroll-view组件实现列表页实例代码  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel Docker环境搭建教程_Laravel Sail使用指南  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  如何在景安云服务器上绑定域名并配置虚拟主机?  如何构建满足综合性能需求的优质建站方案?  jquery插件bootstrapValidator表单验证详解  手机软键盘弹出时影响布局的解决方法  canvas 画布在主流浏览器中的尺寸限制详细介绍  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何基于PHP生成高效IDC网络公司建站源码?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  音响网站制作视频教程,隆霸音响官方网站?  如何快速使用云服务器搭建个人网站?  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel如何配置和使用缓存?(Redis代码示例)  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  如何用JavaScript实现文本编辑器_光标和选区怎么处理  用v-html解决Vue.js渲染中html标签不被解析的问题  Laravel如何使用Collections进行数据处理?(实用方法示例)  Bootstrap CSS布局之列表  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何在IIS中新建站点并配置端口与IP地址?  Python面向对象测试方法_mock解析【教程】  如何正确下载安装西数主机建站助手?  如何快速搭建支持数据库操作的智能建站平台?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  在Oracle关闭情况下如何修改spfile的参数  微信小程序 require机制详解及实例代码  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  如何确认建站备案号应放置的具体位置?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  android nfc常用标签读取总结  如何在Windows服务器上快速搭建网站?  如何在不使用负向后查找的情况下匹配特定条件前的换行符