浅谈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服务器上快速搭建网站?
如何在不使用负向后查找的情况下匹配特定条件前的换行符

