浅谈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


相关推荐: 详解jQuery中的事件  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  JavaScript如何操作视频_媒体API怎么控制播放  如何在橙子建站中快速调整背景颜色?  如何在Windows虚拟主机上快速搭建网站?  个人网站制作流程图片大全,个人网站如何注销?  如何快速完成中国万网建站详细流程?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  高端企业智能建站程序:SEO优化与响应式模板定制开发  网站图片在线制作软件,怎么在图片上做链接?  如何快速搭建个人网站并优化SEO?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  奇安信“盘古石”团队突破 iOS 26.1 提权  油猴 教程,油猴搜脚本为什么会网页无法显示?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Python3.6正式版新特性预览  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  如何快速搭建FTP站点实现文件共享?  Android GridView 滑动条设置一直显示状态(推荐)  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  再谈Python中的字符串与字符编码(推荐)  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  使用Dockerfile构建java web环境  JS经典正则表达式笔试题汇总  iOS验证手机号的正则表达式  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Android中AutoCompleteTextView自动提示  怎么用AI帮你为初创公司进行市场定位分析?  如何确认建站备案号应放置的具体位置?  如何在IIS7中新建站点?详细步骤解析  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Laravel如何创建自定义Artisan命令?(代码示例)  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Python进程池调度策略_任务分发说明【指导】  如何选择可靠的免备案建站服务器?  如何快速生成高效建站系统源代码?