简介

yield from 是在Python3.3才出现的语法。所以这个特性在Python2中是没有的

yield from 后面需要加的是可迭代对象,它可以是普通的可迭代对象,也可以是迭代器,甚至是生成器。

使用

astr='ABC'
alist=[1,2,3]
adict={"name":"wangbm","age":18}agen=(i for i in range(4,8)) # 生成器def gen(*args, **kw):for item in args:yield from itemnew_list=gen(astr, alist, adict, agen)
print(list(new_list))
['A', 'B', 'C', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]Process finished with exit code 0

yield from后面加上可迭代对象,他可以把可迭代对象里的每个元素一个一个的yield出来,对比yield来说代码更加简洁,结构更加清晰。

复杂应用:生成器的嵌套

yield from 后面加上一个生成器后,就实现了生成的嵌套。

使用yield from可以让我们避免让我们自己处理各种料想不到的异常,而让我们专注于业务代码的实现

概念

  • 调用方:调用委派生成器的客户端(调用方)代码
  • 委托生成器:包含yield from表达式的生成器函数
  • 子生成器:yield from后面加的生成器函数
# 子生成器
def average_gen():total = 0count = 0average = 0while True:new_num = yield averagecount += 1total += new_numaverage = total/count# 委托生成器
def proxy_gen():while True:yield from average_gen()# 调用方
def main():calc_average = proxy_gen()next(calc_average)            # 预激下生成器print(calc_average.send(10))  # 打印:10.0print(calc_average.send(20))  # 打印:15.0print(calc_average.send(30))  # 打印:20.0if __name__ == '__main__':main()
10.0
15.0
20.0
计算完毕!!
总共传入 3 个数值, 总和:60,平均数:20.0Process finished with exit code 0

委托生成器的作用是:在调用方与子生成器之间建立一个双向通道。

双向通道是什么?
调用方可以通过send()直接发送消息给子生成器,而子生成器yield的值,也是直接返回给调用方。

委托生成器,只起一个桥梁作用,它建立的是一个双向通道,它并没有权利也没有办法,对子生成器yield回来的内容做拦截。

处理异常

yield from帮我们做了很多的异常处理,而且全面,而这些如果我们要自己去实现的话,一个是编写代码难度增加,写出来的代码可读性极差,这些我们就不说了,最主要的是很可能有遗漏,只要哪个异常没考虑到,都有可能导致程序崩溃什么的。

生成器 yield from相关推荐

  1. js date 当前日志往后一个月_【应用实例】如何利用 Python 生成器 yield 监控日志?...

    Python 生成器 yield 是编写基于处理管道,流或数据流程序的一种极其强大的方式,在<Python参考手册>中有一则实例非常简单实用,略加修改,分享一下给大家.如果你对生成器yie ...

  2. php yield 个人小解_PHP中的性能优化利器:生成器 yield 理解

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者都不知道有生成器这个功能,但是,生成器功能的确非常有用.人家 yield 这个东西是从PHP 5.5就开始引入了,官方 ...

  3. 迭代器与生成器yield

    迭代器 迭代器是一个可以记住遍历的位置的对象,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 方法:iter() ,next(). 载体:字符串,列表或元组 ...

  4. python生成器yield原理_生成器yield关键字详解

    鉴于yield关键字的原理大家理解的都不是很深刻,今天我们主要就这一课题进行探讨. 生成器可以用什么方式得到? 方法一: 利用推导式的方式得到生成器# 列表推导式 list1 = [i for i i ...

  5. python生成器yield_python 生成器yield的总结

    (1):通常的for..in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件.他可以是a = [1,2,3],也可以是a = [x*x for x in ra ...

  6. python生成器yield原理_Python generator生成器和yield表达式详解

    前言 Python生成器(generator)并不是一个晦涩难懂的概念.相比于MetaClass和Closure等概念,其较为容易理解和掌握.但相对于程序结构:顺序.循环和分支而言其又不是特别的直观. ...

  7. 【生成器】PHP的生成器yield【原创】

    在PHP 5.5中,PHP多了一个新的特性,那就是生成器(Generator).生成器提供了一种更简单的方法来实现简单的对象迭代. 下面的Manual的引用: 生成器提供了一种更容易的方法来实现简单的 ...

  8. python生成器yield原理_Python的迭代器和生成器 使用实例及yield的使用

    <派森>(Python)3.13 win32 英文安装版 类型:编程工具大小:21M语言:英文 评分:8.7 标签: 立即下载 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素 ...

  9. Python生成器 yield

    迭代器与list相比较,就for in句型循环拿数据而言: 用list写很简洁,但如果list数据过大,会很消耗资源. 用iteration 迭代器写,则不会消耗那么多资源.他会随用随取,用一个拿一个 ...

最新文章

  1. 万能素材库_高中作文经典人物万能素材积累
  2. docker java 最小镜像_docker构建JDK最小镜像
  3. C语言鹦鹉学舌1,鹦鹉学舌真是简单的学舌吗?为什么他们清晰的知道在哪用哪些词...
  4. 坐在马桶上看算法:只有五行的Floyd最短路算法
  5. linux 使用jstack_案例解析:线程池使用不当导致的系统崩溃
  6. android pss内存,如何释放android系统中pss cache住的内存
  7. Spring4.x()---JdbcDaoSupport的使用
  8. JAVA面试之互联网、经验篇
  9. Druid创始人Eric Tschetter详解开源实时大数据分析系统Druid
  10. mac java开发如何_Macbook适合Java开发吗?
  11. 基于NB-IOT的智能烟感应用方案
  12. 0x8000FFFF 错误的解决方式
  13. bulma css 中文,Bulma CSS – 开始
  14. 服务器虚拟化用什么显卡,显卡虚拟化使用及配置技术
  15. 原生js实现table 横向纵向全选功能
  16. 【Android 11】【WiFi模块】WiFi打开函数调用流程图
  17. 【Linux】服务器部署:阿里云服务器购买配置与报价参考
  18. UVA 167(The Sultan's Successors)八皇后回溯
  19. 热点解答:nmn抗衰老安全吗,nmn最安全的品牌是什么
  20. 一份小白前端可视化学习指南——附思维导图

热门文章

  1. python试卷河南理工大学官网_河南理工大学历年大学物理试卷及答案
  2. 胡润研究院第二年发布中国豪华车品牌特性研究白皮书
  3. 通宵整理的Java知识点,看完膨胀了
  4. java变态跳台阶(思路与实现)
  5. EasyExcel项目实例
  6. 酷开系统8无界空间,打动用户的正确姿势
  7. luogu2763 试题库问题
  8. SFS工具箱-Linux工具箱大全专注原创技术
  9. 程序员学炒股(5) 股指交割日效应是否存在?
  10. Mac OS中使用VScode配置C++语言开发环境